我有一段简单的代码没有像我预期的那样工作,有人可以解释为什么它没有填充字段数组以及如何解决它。
$fields = [];
array_walk($class->properties, function($v, $k) use ($fields) {
$fields[] = $v->name;
});
die(var_dump($fields));
// output is []
我有一段简单的代码没有像我预期的那样工作,有人可以解释为什么它没有填充字段数组以及如何解决它。
$fields = [];
array_walk($class->properties, function($v, $k) use ($fields) {
$fields[] = $v->name;
});
die(var_dump($fields));
// output is []
用这个:
$fields = [];
array_walk($class->properties, function($v, $k) use (&$fields) {
$fields[] = $v->name;
});
die(var_dump($fields));
在我写完这篇文章后,我看到了 Mark Baker 的评论。这是正确的答案。
供参考,请参阅:
或者,您可以使用array_map()
:
$fields = array_map(function($v) {
return $v->name;
}, $class->properties);
die(var_dump($fields));
供参考,请参阅:
下面的代码演示了一个类,它的唯一属性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 )
如果代码需要对元素的键做某事,指定会很有帮助。