2

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

$fields = [];

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

die(var_dump($fields));

// output is []
4

3 回答 3

3

用这个:

$fields = [];

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

die(var_dump($fields));

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

供参考,请参阅:

于 2017-08-11T21:42:27.833 回答
1

或者,您可以使用array_map()

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

die(var_dump($fields));

供参考,请参阅:

于 2017-08-11T22:16:41.513 回答
0

下面的代码演示了一个类,它的唯一属性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 );
}

查看实时代码

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

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

于 2017-08-12T00:48:29.687 回答