使用 array_walk_recursive 更新值时出现问题

Having problems updating values in with array_walk_recursive

我正在处理需要 str_replace 冒号和空格的代码。因为我不知道我的数组会有多深,所以我必须使用 array_walk_recursive 函数。问题是 str_replace 没有被计入帐户(读取不起作用)。请大家帮帮我。

这是我的代码

public function removeColonsFromStrings(array $inputs) {
    d($inputs); // some dump function
    array_walk_recursive($inputs, function (&$item, $key) {
        $inputs[$key] = str_replace(':',' ', $item);
    });
    dd($inputs); //dump and die function

    return $inputs;
}

输出如下

// first d() output
    array(7) {
      ["GivenName"]=>
      string(5) "Me"
      ["FamilyName"]=>
      string(7) "Me"
      ["DisplayName"]=>
      string(19) "[id:: 68]"
      ["CompanyName"]=>
      string(19) "[id:: 68]"
      ["FullyQualifiedName"]=>
      string(0) ""
      ["PrimaryPhone"]=>
      array(1) {
        ["FreeFormNumber"]=>
        string(0) ""
      }
      ["PrimaryEmailAddr"]=>
      array(1) {
        ["Address"]=>
        string(24) "my@email.com"
      }
    }

// Second dd() output    
    array(7) {
      ["GivenName"]=>
      string(5) "Me"
      ["FamilyName"]=>
      string(7) "Me"
      ["DisplayName"]=>
      string(19) "[id:: 68]"
      ["CompanyName"]=>
      string(19) "[id:: 68]"
      ["FullyQualifiedName"]=>
      string(0) ""
      ["PrimaryPhone"]=>
      array(1) {
        ["FreeFormNumber"]=>
        string(0) ""
      }
      ["PrimaryEmailAddr"]=>
      array(1) {
        ["Address"]=>
        string(24) "my@email.com"
      }
    }

那么如何正确更新数组中的值?如果您需要任何其他信息,请告诉我,我会提供。谢谢!

您需要调整 $item 而不是 $inputs[$key]

发送引用时,您需要覆盖旧值。

array_walk_recursive($inputs, function (&$item, $key) {
  $item = str_replace(':',' ', $item);
});

您正在通过引用修改叶节点值 (&),因此您可以使用 values 变量(函数调用中的第一个参数)覆盖值,因此无需将键标识为函数调用中的第二个 variable/parameter。

Test/Proof: (Demo)

$inputs = ['a:', 'b:', ['c:'], 'd:'];
array_walk_recursive(
    $inputs,
    function(&$v) {
        $v = str_replace(':', ' ', $v);
    }
);
var_export($inputs);

或使用 PHP7.4 中的箭头函数:(Demo)

array_walk_recursive(
    $inputs,
    fn(&$v) => $v = str_replace(':', ' ', $v)
);

输出:

array (
  0 => 'a ',
  1 => 'b ',
  2 => 
  array (
    0 => 'c ',
  ),
  3 => 'd ',
)

在其他情况下,有时会调用 use(&$outputvariable) 以允许访问内部生成的数据,after/outside 函数。 但是,这不会像 array_walk_recursive() 的预期那样工作,因为 key 将是“深度无知”。将此效果视为 c (key=[2][0]) 覆盖 a (key=[0])

代码:

$inputs=['a:','b:',['c:'],'d:'];
array_walk_recursive($inputs,function($v,$k)use(&$result){
        $result[$k]=str_replace(':',' ',$v);
    });
var_export($result);

输出:

array (
  0 => 'c ',
  1 => 'b ',
  3 => 'd ',
)