【问题标题】:array_walk trying to write to outside arrayarray_walk 试图写入外部数组
【发布时间】:2017-08-11 21:39:30
【问题描述】:

我有一段简单的代码没有像我预期的那样工作,有人可以解释为什么它没有填充字段数组以及如何解决它。

$fields = [];

array_walk($class->properties, function($v, $k) use ($fields) {
    $fields[] = $v->name;
});

die(var_dump($fields));

// output is []

【问题讨论】:

  • use 中通过引用传递,而不是通过值传递:array_walk($class->properties, function($v, $k) use (&$fields){$fields[] = $v->name;});
  • 对于这个用例值得指出的是,函数array_map 会是一个更好的选择。
  • 带有 var_dump() 的 die() 是免费的。

标签: php array-walk


【解决方案1】:

使用这个:

$fields = [];

array_walk($class->properties, function($v, $k) use (&$fields) {
    $fields[] = $v->name;
});

die(var_dump($fields));

在我写完这篇文章后,我看到了 Mark Ba​​ker 的评论。这是正确的答案。

参考见:

【讨论】:

    【解决方案2】:

    或者,您可以使用array_map()

    $fields = array_map(function($v) {
        return $v->name;
    }, $class->properties);
    
    die(var_dump($fields));
    

    参考见:

    【讨论】:

      【解决方案3】:

      下面的代码演示了一个类,它的唯一属性properties包含一个对象数组,每个对象都有一个name属性,如下:

      <?php
      
      $class = new stdClass;
      $class->properties = [new stdClass,new stdClass, new stdClass];
      
      $class->properties[0]->name = "Anne";
      $class->properties[1]->name = "Bob";
      $class->properties[2]->name = "Robin";
      
      $fieldsA = [];
      $fieldsB = [];
      
      if ( array_walk( $class->properties, function( $o ) use ( &$fieldsA ){ 
                                            $fieldsA[] = $o->name;
                                          }) ) {
         echo "\nMission accomplished:\n";
         var_dump($fieldsA);
      }
      
      $fieldsB = array_map(  function( $e ) {
                                            return $e->name;
                                            },$class->properties);
      if (count($fieldsB) > 0) {
         echo "\nMission accomplished:\n";
         var_dump( $fieldsB );
      }
      

      live code

      您可能注意到,array_walk()array_map() 都将产生相同的结果,即用三个对象包含的名称填充新数组。 Array_map() 比需要使用变量和引用运算符的 array_walk() 提供更多的简单性。此外,如果一切顺利,array_map() 的返回值是一个全新的数组。所以,我同意@localheinz 并推荐它作为更好的选择。

      注意:关于回调,不需要指定value、key参数。这两个内置函数都会检查 properties 的每个元素。如果代码需要对元素的键执行某些操作,则指定 function( $v, $k ) 会很有帮助。

      【讨论】:

        猜你喜欢
        • 2011-07-14
        • 2012-01-06
        • 1970-01-01
        • 1970-01-01
        • 2013-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多