4

我有一个数组,其中包含一个非常大的多维数组中值的位置。我需要获取这个位置并将该位置的值替换为另一个值。我发现了许多关于通过编写递归函数使用这样的索引数组返回位置值的文章。但是,这不起作用,因为我无法分割大数组,我只需要替换那个值。

该位置将类似于:

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];

谢谢

4

4 回答 4

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 这将传入实际的数组,以便你可以就地修改它。否则,您将只是传递一份副本。

于 2012-05-10T19:11:40.037 回答
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';
于 2012-05-10T19:04:50.673 回答
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'
于 2012-05-10T19:11:06.357 回答
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);
于 2012-05-10T19:20:48.893 回答