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



我正在使用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);

我期望发生的事情是每次发现键['content'],无论深度如何,它都取代了$ data参数中指定的值。

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

我缺少什么?

with 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;
}

要扩展我的评论,您需要在此处引用:

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

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

来自foreach的PHP手册条目:

为了能够直接修改循环中的数组元素,先于$ amp;。在这种情况下,该值将通过参考分配。

您还会在手册中看到它建议在循环后解除对$value的引用。即使您不在功能中不这样做,也可能不会引起任何问题,但最好习惯于始终避免像这样的foreach循环中创建的参考。如果您不这样做,它可能会导致一些奇怪的问题。

来自php7.4,"箭头功能"语法提供了干净和简短的方法。

迭代为叶子,如果键是 content,则替换文本,否则请勿更改值。

没有使用return s。所有突变都直接应用于带有&的变量中传递的变量。

function replace_data(&$array, $replaceWith = 'REPLACE TEST')
{
   array_walk_recursive(
        $array,
        fn(&$v, $k) => $v = ($k === 'content' ? $replaceWith : $v)
    );
}
replace_data($json_array, "test test test");
var_export($json_array);

最新更新