如何递归搜索和替换未知深度多维PHP数组中的值?

时间:2016-12-23 16:36:01

标签: php json recursion multidimensional-array pass-by-reference

我正在使用JSON字符串。我将其转换为关联数组以查找特定值,并在找到某个键​​时更改这些值([' content'])。阵列的深度始终是未知的,并且总是会变化的。

这是我写的功能。它将一个数组作为参数并通过引用传递它,以便修改变量本身,而不是将其本地作用于该函数的副本。

$json_array = json_decode($json_string, true);

function replace_data(&$json_array, $data='REPLACE TEST')
{
   foreach($json_array as $key => $value) {
       if ($key == 'content' && !is_array($value)) {
           $json_array[$key] = $data;

       } else {
           if (is_array($value)) {
               replace_data($value, $data);
           }
       }
   }

}


replace_data($json_array, "test test test");
var_dump($json_array);

我期待发生的事情是,无论在什么深度找到密钥['内容'],它都会替换$ data参数中指定的值。

但是,当我var_dump($json_array)时,这些值不变。

我错过了什么?

2 个答案:

答案 0 :(得分:3)

使用array_walk_recursive

function replace_data($json_array, $data = 'REPLACE TEST') {
    array_walk_recursive($json_array, function (&$value, $key) use ($data) {
        if (!is_array($value) && $key === 'content') {
            // $value passed by reference
            $value = $data;
        }
    });
    return $json_array;
}

没有参考:

function replace_data($json_array, $data = 'REPLACE TEST') {
    foreach ($json_array as $key => $value) {
        if (is_array($value)) {
            $json_array[$key] = replace_data($value, $data);
        } elseif ($key === 'content') {
            $json_array[$key] = $data;
        }
    }
    return $json_array;
}

答案 1 :(得分:1)

要扩展我的评论,您需要另一个参考:

foreach($json_array as $key => &$value) {

这样,当您进行递归调用时,将传递对原始值的引用,而不是使用foreach循环创建的本地副本。

来自PHP manual entry for foreach

  

为了能够直接修改循环中的数组元素,在$ value之前加上&amp ;.在这种情况下,该值将通过引用分配。

您还会在手册中看到它建议在循环后取消设置$value的引用。尽管如果你不在你的函数中做到这一点,它可能不会引起任何问题,但最好养成总是在foreach循环中创建引用的习惯。 。如果你不这样做,可能会导致一些strange looking problems