php – 如何编写getter / setter以通过键名来访问多级数组?
发布时间:2020-12-13 16:32:58 所属栏目:PHP教程 来源:网络整理
导读:我必须在 PHP中实现一个setter,它允许我指定数组(目标)的键或子键,将该名称作为点分隔键值传递. 给出以下代码: $arr = array('a' = 1,'b' = array( 'y' = 2,'x' = array('z' = 5,'w' = 'abc') ),'c' = null);$key = 'b.x.z';$path = explode('.',$key); 从$
|
我必须在
PHP中实现一个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指向的元素的值? 对于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),但是我不能在原来的数组中设置这个值,我不知道如何一次性地指定这个键. 我应该使用某种回溯吗?还是我可以避免呢?
假设$path已经是通过explode()(或添加到函数)的数组,然后使用引用.您需要添加一些错误检查,以防无效$path等…
$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;
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |








