Рішення залежить від версії PHP, яку ви використовуєте. Принаймні, є 2 рішення:
По-перше (новіші версії PHP)
Як сказала @JosepAlsina, найкращим, а також найкоротшим рішенням є використання array_columnнаступного:
$catIds = array_column($objects, 'id');
Примітка.
Для ітерації arrayвмісту \stdClasses, що використовується у питанні, це можливо лише у версіях PHP >= 7.0. Але при використанні arrayмістять arrays ви можете зробити те ж саме з PHP >= 5.5.
Другий (Старіші версії PHP)
@Greg сказав, що в старих версіях PHP можна зробити наступне:
$catIds = array_map(create_function('$o', 'return $o->id;'), $objects);
Але будьте обережні: у нових версіях PHP >= 5.3.0краще використовувати Closures, як слід:
$catIds = array_map(function($o) { return $o->id; }, $objects);
Різниця
Спочатку рішення створює нову функцію і вводить її у вашу ОЗУ. Колекціонер сміття чомусь не видаляє створений і вже викликаний екземпляр функції з пам'яті. І що незалежно від того, що створений екземпляр функції більше ніколи не може бути викликаний, оскільки ми не маємо на нього вказівника. І наступного разу, коли цей код буде викликаний, знову буде створена та сама функція. Така поведінка повільно заповнює вашу пам’ять ...
Обидва приклади з вихідною пам'яттю для їх порівняння:
БАД
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
...
ДОБРО
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'?