脚本宝典收集整理的这篇文章主要介绍了php – 如何编写getter / setter以通过键名来访问多级数组?,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
给出以下代码:
$arr = array('a' => 1,'b' => array( 'y' => 2,'x' => array('z' => 5,'w' => 'abc') ),'c' => null); $key = 'b.x.z'; $path = explode('.',$key);
从$key的值我想达到$arr [‘b’] [‘x’] [‘z’]的值5.
现在….
给出$key的变量值和不同的$arr值(具有不同的深度).
如何设置$key指向的元素的值?
对于getter get()我写了这段代码:
public static function get($name,$default = null) { $setting_path = explode('.',$name); $val = $this->settings; foreach ($setting_path as $key) { if(array_key_exists($key,$val)) { $val = $val[$key]; } else { $val = $default; break; } } return $val; }
写一个setter是比较困难的,因为我成功地达到了正确的元素(从$key),但是我不能在原来的数组中设置这个值,我不知道如何一次性地指定这个键.
我应该使用某种回溯吗?还是我可以避免呢?
$key = 'b.x.z'; $path = explode('.',$key);
消气
function get($path,$array) { $temp = &$array; foreach($path as $key) { $temp =& $temp[$key]; } return $temp; } $value = get($path,$arr); //returns NULL if the path doesn't exist
塞特/创造者
此组合将在现有数组中设置一个值,如果传递尚未定义的数组,则创建数组.确保定义$array将被引用& $array传递:
function set($path,&$array=array(),$value=null) { $temp = &$array; foreach($path as $key) { $temp =& $temp[$key]; } $temp = $value; } set($path,$arr); //or set($path,$arr,'some value');
*原来的答案有一些有限的功能,我会离开,以防万一他们对某人有用:
二传手
确保定义$array将被引用& $array传递:
function set(&$array,$path,$value) { $temp = &$array; foreach($path as $key) { $temp =& $temp[$key]; } $temp = $value; } set($arr,'some value');
或者如果要返回更新的数组(因为我很无聊):
function set($array,$value) { $temp = &$array; foreach($path as $key) { $temp =& $temp[$key]; } $temp = $value; return $array; } $arr = set($arr,'some value');
创造者
如果您不创建数组,并且可选择设置值:
function create($path,$value=null) { foreach(array_reverse($path) as $key) { $value = array($key => $value); } return $value; } $arr = create($path); //or $arr = create($path,'some value');
为了娱乐
构造和评估像$array [‘b’] [‘x’] [‘z’] ;:
function get($array,$path) { $path = "['" . implode("']['",$path) . "']"; eval("\$result = \$array{$path};"); return $result; }
以上是脚本宝典为你收集整理的php – 如何编写getter / setter以通过键名来访问多级数组?全部内容,希望文章能够帮你解决php – 如何编写getter / setter以通过键名来访问多级数组?所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。