使用array_walk_recursive更新值时遇到问题

时间:2017-07-14 09:53:45

标签: php cakephp-2.0

我正在研究需要使用空格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"
      }
    }

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

3 个答案:

答案 0 :(得分:1)

发送参考时,您需要覆盖旧值。

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

答案 1 :(得分:1)

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

测试/证明:(Demo

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

输出:

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

在其他情况下,有时调用use(&$outputvariable)以允许在函数之外/之外访问内部生成的数据。但是,这不会像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 ',
)

答案 2 :(得分:0)

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