La soluzione dipende dalla versione PHP che stai utilizzando. Almeno ci sono 2 soluzioni:
Primo (versioni PHP più recenti)
Come ha detto @JosepAlsina prima, la soluzione migliore e anche la più breve è quella di utilizzare array_columncome segue:
$catIds = array_column($objects, 'id');
Avviso:
per iterare un arraycontenitore \stdClasscome usato nella domanda è possibile solo con le versioni PHP >= 7.0. Ma quando usi un arraycontenitore arrays puoi fare lo stesso da PHP >= 5.5.
Secondo (versioni PHP precedenti)
@ Greg ha detto che nelle versioni precedenti di PHP è possibile fare quanto segue:
$catIds = array_map(create_function('$o', 'return $o->id;'), $objects);
Ma attenzione: nelle versioni PHP più recenti >= 5.3.0è meglio usare Closures, come segue:
$catIds = array_map(function($o) { return $o->id; }, $objects);
La differenza
La prima soluzione crea una nuova funzione e la inserisce nella RAM. Il garbage collector non elimina l'istanza di funzione già creata e già chiamata fuori dalla memoria per qualche motivo. E questo indipendentemente dal fatto che l'istanza della funzione creata non possa mai essere chiamata di nuovo, perché non abbiamo alcun puntatore per essa. E la prossima volta che viene chiamato questo codice, la stessa funzione verrà creata di nuovo. Questo comportamento riempie lentamente la tua memoria ...
Entrambi gli esempi con output in memoria per confrontarli:
MALE
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
...
BENE
while (true)
{
$objects = array_map(function($o) { return $o->id; }, $objects);
echo memory_get_usage() . "\n";
sleep(1);
}
// the output
4235136
4235168
4235168
4235168
...
Questo può anche essere discusso qui
Perdita di memoria?! Garbage Collector funziona correttamente quando si utilizza "create_function" all'interno di "array_map"?