Die Lösung hängt von der verwendeten PHP-Version ab. Zumindest gibt es 2 Lösungen:
Erstens (neuere PHP-Versionen)
Wie @JosepAlsina zuvor sagte, besteht die beste und auch kürzeste Lösung darin, array_columnFolgendes zu verwenden:
$catIds = array_column($objects, 'id');
Hinweis:
Zum Iterieren eines in der Frage verwendeten arrayenthaltenden \stdClassES ist dies nur mit PHP-Versionen möglich >= 7.0. Aber wenn Sie ein arrayenthaltendes arrays verwenden, können Sie dasselbe seit PHP tun >= 5.5.
Zweitens (ältere PHP-Versionen)
@ Greg sagte, in älteren PHP-Versionen sei Folgendes möglich:
$catIds = array_map(create_function('$o', 'return $o->id;'), $objects);
Aber Vorsicht: In neueren PHP-Versionen ist >= 5.3.0es besser, Closures zu verwenden , wie folgt:
$catIds = array_map(function($o) { return $o->id; }, $objects);
Der Unterschied
Die erste Lösung erstellt eine neue Funktion und legt sie in Ihrem RAM ab. Der Garbage Collector löscht die bereits erstellte und bereits aufgerufene Funktionsinstanz aus irgendeinem Grund nicht aus dem Speicher. Und das unabhängig davon, dass die erstellte Funktionsinstanz nie wieder aufgerufen werden kann, weil wir keinen Zeiger dafür haben. Und wenn dieser Code das nächste Mal aufgerufen wird, wird dieselbe Funktion erneut erstellt. Dieses Verhalten füllt langsam Ihr Gedächtnis ...
Beide Beispiele mit Speicherausgabe zum Vergleich:
SCHLECHT
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
...
GUT
while (true)
{
$objects = array_map(function($o) { return $o->id; }, $objects);
echo memory_get_usage() . "\n";
sleep(1);
}
// the output
4235136
4235168
4235168
4235168
...
Dies kann auch hier diskutiert werden
Speicherleck?! Funktioniert Garbage Collector richtig, wenn 'create_function' in 'array_map' verwendet wird?