Solusinya tergantung pada versi PHP yang Anda gunakan. Setidaknya ada 2 solusi:
Pertama (Versi PHP yang lebih baru)
Seperti yang dikatakan @JosepAlsina sebelumnya, solusi terbaik dan terpendek adalah menggunakan array_columnsebagai berikut:
$catIds = array_column($objects, 'id');
Perhatian:
Untuk iterasi es yang arraymengandung \stdClassseperti yang digunakan dalam pertanyaan itu hanya mungkin dengan versi PHP >= 7.0. Tetapi ketika menggunakan yang arraymengandung arrayAnda dapat melakukan hal yang sama sejak PHP >= 5.5.
Kedua (Versi PHP yang lebih lama)
@Greg mengatakan dalam versi PHP yang lebih lama dimungkinkan untuk melakukan hal berikut:
$catIds = array_map(create_function('$o', 'return $o->id;'), $objects);
Namun berhati-hatilah: Dalam versi PHP yang lebih baru >= 5.3.0, lebih baik menggunakan Closures, seperti berikut:
$catIds = array_map(function($o) { return $o->id; }, $objects);
Perbedaan
Solusi pertama membuat fungsi baru dan memasukkannya ke dalam RAM Anda. Pengumpul sampah tidak menghapus instance fungsi yang sudah dibuat dan sudah dipanggil dari memori karena beberapa alasan. Dan terlepas dari faktanya, bahwa instance fungsi yang dibuat tidak akan pernah bisa dipanggil lagi, karena kita tidak memiliki pointer untuk itu. Dan saat kode ini dipanggil, fungsi yang sama akan dibuat lagi. Perilaku ini perlahan mengisi ingatan Anda ...
Kedua contoh dengan keluaran memori untuk membandingkannya:
BURUK
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
...
BAIK
while (true)
{
$objects = array_map(function($o) { return $o->id; }, $objects);
echo memory_get_usage() . "\n";
sleep(1);
}
// the output
4235136
4235168
4235168
4235168
...
Ini juga dapat didiskusikan di sini
Kebocoran memori ?! Apakah Pengumpul Sampah melakukan dengan benar saat menggunakan 'create_function' dalam 'array_map'?