Решение зависит от версии PHP, которую вы используете. По крайней мере, есть 2 решения:
Первый (более новые версии PHP)
Как сказал @JosepAlsina ранее, лучшее и самое короткое решение - использовать array_column
следующим образом:
$catIds = array_column($objects, 'id');
Примечание:
Для итерации array
, содержащей \stdClass
es, как используется в вопросе, это возможно только с версиями PHP >= 7.0
. Но при использовании array
, содержащего array
s, вы можете сделать то же самое с PHP >= 5.5
.
Второй (более старые версии PHP)
@ Грег сказал, что в старых версиях PHP можно сделать следующее:
$catIds = array_map(create_function('$o', 'return $o->id;'), $objects);
Но будьте осторожны: В более новых версиях PHP >= 5.3.0
лучше использовать Closure
s, например:
$catIds = array_map(function($o) { return $o->id; }, $objects);
Разница
Первое решение создает новую функцию и помещает ее в оперативную память. Сборщик мусора по какой-то причине не удаляет уже созданный и уже вызванный экземпляр функции из памяти. И это независимо от того, что созданный экземпляр функции никогда не может быть вызван снова, потому что у нас нет указателя на него. И в следующий раз, когда этот код будет вызван, эта же функция будет создана снова. Такое поведение медленно заполняет вашу память ...
Оба примера с выводом памяти для сравнения:
BAD
while (true)
{
$objects = array_map(create_function('$o', 'return $o->id;'), $objects);
echo memory_get_usage() . "\n";
sleep(1);
}
// the output
4235616
4236600
4237560
4238520
...
GOOD
while (true)
{
$objects = array_map(function($o) { return $o->id; }, $objects);
echo memory_get_usage() . "\n";
sleep(1);
}
// the output
4235136
4235168
4235168
4235168
...
Это также можно обсудить здесь
Утечка памяти ?! Правильно ли работает сборщик мусора при использовании 'create_function' внутри 'array_map'?