У меня есть простой кусок кода, который не работает так, как я ожидал бы, может кто-нибудь объяснить, почему он не заполняет массив полей и как его решить.
$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));
После того, как я написал это, я увидел комментарий Марка Бейкера. Это правильный ответ.
Для справки смотрите:
Кроме того, вы можете использовать array_map()
:
$fields = array_map(function($v) {
return $v->name;
}, $class->properties);
die(var_dump($fields));
Для справки смотрите:
Следующий код демонстрирует класс, единственное свойство свойства содержит массив объектов, каждый из которых имеет свойство 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 и рекомендую его как лучший выбор.
Примечание: в отношении обратного вызова нет необходимости указывать значение, ключевые параметры. Обе эти встроенные функции проверяют каждый элемент свойства. Определение function( $v, $k )
было бы полезно, если бы код должен был что-то делать с ключом элемента.