如果我有一个数组对应于另一个数组中的连续递归键,那么为这个“路径”赋值的最佳方法是什么(如果你想把它称之为)?
例如:
$some_array = array();
$path = array('a','b','c');
set_value($some_array,$path,'some value');
现在,$some_array
应该等于
array(
'a' => array(
'b' => array(
'c' => 'some value'
)))
目前,我正在使用以下内容:
function set_value(&$dest,$path,$value) {
$addr = "\$dest['" . implode("']['", $path) . "']";
eval("$addr = \$value;");
}
显然,这是一种非常天真的方法并且存在安全风险,所以你会怎么做?
答案 0 :(得分:2)
递归解决方案(未测试):
function set_value(&$dest,$path,$value) {
$index=array_shift($path);
if(empty($path)){
// on last level
$dest[$index]=$value;
}
else{
// descending to next level
set_value($dest[$index],$path,$value);
}
}
答案 1 :(得分:2)
是的,eval
通常不是最好的主意。
就个人而言,我只想迭代:
function set_value(&$dest,$path,$value) {
$val =& $dest;
for($i = 0; $i > count($path) - 1; $i++) {
$val =& $val[$i];
}
$val[$path[$i]] = $value;
}
如果您使用的是PHP 5,那么您可能会得到其中一些'&'太
答案 2 :(得分:2)
function set_value(&$dest, $path, $value)
{
# allow for string paths of a/b/c
if (!is_array($path)) $path = explode('/', $path);
$a = &$dest;
foreach ($path as $p)
{
if (!is_array($a)) $a = array();
$a = &$a[$p];
}
return $a = $value;
}
set_value($a, 'a/b/c', 'foo');
更新以使用尚不存在的键,并接受数组或字符串路径。
答案 3 :(得分:2)
function set_value(&$dest, $path, $value) {
$dest = array(array_pop($path) => $value);
for($i = count($path) - 1; $i >= 0; $i--) {
$dest = array($path[$i] => $dest);
}
}