Die Lösung hängt von der PHP-Version ab, die Sie verwenden. Es gibt mindestens 2 Lösungen:
Erste (neuere PHP-Versionen)
Wie @JosepAlsina schon sagte, ist die beste und auch kürzeste Lösung die Verwendung von array_column
wie folgt:
$catIds = array_column($objects, 'id');
Hinweis: Für die Iteration einer array
mit \stdClass
es, wie in der Frage verwendet, ist nur mit PHP-Versionen möglich >= 7.0
. Aber bei der Verwendung eines array
mit array
s können Sie dasselbe tun, da PHP >= 5.5
.
Zweitens (Ältere PHP-Versionen)
@Greg sagte, dass es in älteren PHP-Versionen möglich ist, folgendes zu tun:
$catIds = array_map(create_function('$o', 'return $o->id;'), $objects);
Aber Vorsicht: In neueren PHP-Versionen >= 5.3.0
ist es besser, zu verwenden Closure
s, wie folgt:
$catIds = array_map(function($o) { return $o->id; }, $objects);
Der Unterschied
Die erste Lösung erstellt eine neue Funktion und legt sie im RAM ab. Der Garbage Collector löscht die bereits erstellte und bereits aufgerufene Funktionsinstanz aus irgendeinem Grund nicht aus dem Speicher. Und das ungeachtet der Tatsache, dass die erstellte Funktionsinstanz nie wieder aufgerufen werden kann, weil wir keinen Zeiger für sie haben. Und das nächste Mal, wenn dieser Code aufgerufen wird, wird dieselbe Funktion erneut erstellt werden. Dieses Verhalten füllt langsam Ihren Speicher...
Beide Beispiele mit Speicherausgabe, um sie zu vergleichen:
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
...
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?! Macht der Garbage Collector alles richtig, wenn er 'create_function' innerhalb von 'array_map' verwendet?