我有一个数组,其中包含非常大的多维数组中值的位置。我需要获取此位置并将该位置的值替换为另一个值。我发现了许多关于通过编写递归函数来使用这样的索引数组返回位置值的文章。但是,这不起作用,因为我无法切割大型数组,我只需要替换那个值。
该位置看起来像:
array(1,5,3,4,6);
我必须找到一个值的代码如下:
function replace_value($indexes, $array, $replacement){
if(count($indexes) > 1)
return replace_value(array_slice($indexes, 1), $array[$indexes[0]], $replacement);
else
return $array[$indexes[0]];
}
}
我如何修改它而不是递归地减少数组直到找到值我可以简单地修改一个大数组的一部分?有没有办法建立
array(1,5,3,4,6);
进入
$array[1][5][3][4][6];
由于
答案 0 :(得分:5)
您可以像这样修改您的功能:
function replace_value($indexes, &$array, $replacement){
if(count($indexes) > 1) {
return replace_value(array_slice($indexes, 1), $array[$indexes[0]], $replacement);
} else {
return $array[$indexes[0]] = $replacement;
}
}
确保在函数定义中写入&$array
,而不是$array
这将传入实际数组,以便您可以对其进行修改。否则你只需传递副本。
答案 1 :(得分:3)
假设您信任包含数组索引的变量的内容,这是对eval
的完全有效使用:
$keys = array(1,5,3,4,6);
$keys = "[" . join($keys, "][") . "]";
$value = "what";
eval("\$array$keys = '$value';"); # $array[1][5][3][4][6] = 'what';
答案 2 :(得分:1)
这是一个不使用eval的解决方案。仔细检查每个键并减少阵列。下面的$ref
变量是对原始数组的引用,因此更改它将更改原始数组。
$keys = array(1,5,3,4,6);
$array[1][5][3][4][6] = 'foo';
$ref = &$array;
foreach( $keys as $key ) {
$ref = &$ref[ $key ];
}
$ref = 'bar';
echo $array[1][5][3][4][6]; // 'bar'
答案 3 :(得分:0)
这是未经测试的。我倾向于回避使用引用,因为我认为它们特别令人困惑,并且它们在代码中留下了可能导致难以找到错误的补充引用。
$keys = array(1,5,3,4,6);
$path = 'new leaf value';
foreach (array_reverse($keys) as $key) {
$path = array($key => $path);
}
$modified = array_replace_recursive($origionalArray, $path);