array_walk пытается записать во внешний массив

У меня есть простой кусок кода, который не работает так, как я ожидал бы, может кто-нибудь объяснить, почему он не заполняет массив полей и как его решить.

$fields = [];

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

die(var_dump($fields));

// output is []

1

Решение

Использовать этот:

$fields = [];

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

die(var_dump($fields));

После того, как я написал это, я увидел комментарий Марка Бейкера. Это правильный ответ.

Для справки смотрите:

2

Другие решения

Кроме того, вы можете использовать array_map():

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

die(var_dump($fields));

Для справки смотрите:

1

Следующий код демонстрирует класс, единственное свойство свойства содержит массив объектов, каждый из которых имеет свойство 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 ) было бы полезно, если бы код должен был что-то делать с ключом элемента.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector