我有一段简单的代码不能像我预期的那样工作,请有人解释一下为什么它没有填充字段数组,以及如何解决它。
$fields = [];
array_walk($class->properties, function($v, $k) use ($fields) {
$fields[] = $v->name;
});
die(var_dump($fields));
// output is []
发布于 2017-08-11 21:42:27
用这个:
$fields = [];
array_walk($class->properties, function($v, $k) use (&$fields) {
$fields[] = $v->name;
});
die(var_dump($fields));
写完这篇文章后,我看到了马克·贝克的评论。这是正确的答案。
关于参考,见:
发布于 2017-08-11 22:16:41
或者,您可以使用array_map()
$fields = array_map(function($v) {
return $v->name;
}, $class->properties);
die(var_dump($fields));
关于参考,见:
发布于 2017-08-12 00:48:29
下面的代码演示了一个类,它的唯一属性属性包含一个对象数组,每个对象都有一个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_map()提供了比array_walk()更简单的功能,后者需要一个use变量和一个引用操作符。此外,如果一切顺利,array_map()的返回值是一个全新的数组。因此,我同意@localheinz,并推荐它作为更好的选择。
注意:关于回调,没有必要指定值、键参数。这两个内置函数都检查属性的每个元素。如果代码需要使用元素的键进行操作,那么指定function( $v, $k )
将很有帮助。
https://stackoverflow.com/questions/45644155
复制相似问题