La solution dépend de la version PHP que vous utilisez. Au moins il y a 2 solutions:
First (versions PHP plus récentes)
Comme @JosepAlsina l'a dit avant, la solution la meilleure et la plus courte consiste à utiliser array_columncomme suit:
$catIds = array_column($objects, 'id');
Remarque:
Pour itérer un arraycontenant \stdClasses tel qu'utilisé dans la question, cela n'est possible qu'avec les versions PHP >= 7.0. Mais lorsque vous utilisez un arraycontenant arrays, vous pouvez faire la même chose depuis PHP >= 5.5.
Deuxième (anciennes versions de PHP)
@Greg a déclaré que dans les anciennes versions de PHP, il est possible de faire ce qui suit:
$catIds = array_map(create_function('$o', 'return $o->id;'), $objects);
Mais attention: dans les nouvelles versions de PHP, >= 5.3.0il est préférable d'utiliser Closures, comme suit:
$catIds = array_map(function($o) { return $o->id; }, $objects);
La différence
La première solution crée une nouvelle fonction et la met dans votre RAM. Le garbage collector ne supprime pas l'instance de fonction déjà créée et déjà appelée de la mémoire pour une raison quelconque. Et cela indépendamment du fait, que l'instance de fonction créée ne peut plus jamais être appelée, car nous n'avons pas de pointeur pour elle. Et la prochaine fois que ce code sera appelé, la même fonction sera à nouveau créée. Ce comportement remplit lentement votre mémoire ...
Les deux exemples avec sortie mémoire pour les comparer:
MAUVAIS
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
...
BIEN
while (true)
{
$objects = array_map(function($o) { return $o->id; }, $objects);
echo memory_get_usage() . "\n";
sleep(1);
}
// the output
4235136
4235168
4235168
4235168
...
Cela peut également être discuté ici
Fuite de mémoire?! Garbage Collector fonctionne-t-il correctement lors de l'utilisation de 'create_function' dans 'array_map'?