La solución depende de la versión de PHP que esté utilizando. Al menos hay 2 soluciones:
Primero (versiones PHP más recientes)
Como @JosepAlsina dijo antes, la mejor y más corta solución es usar array_columnlo siguiente:
$catIds = array_column($objects, 'id');
Aviso:
Para iterar un es que arraycontiene \stdClasscomo se usa en la pregunta, solo es posible con versiones de PHP >= 7.0. Pero cuando usas un s que arraycontiene arraypuedes hacer lo mismo desde PHP >= 5.5.
Segundo (versiones anteriores de PHP)
@ Greg dijo en versiones anteriores de PHP que es posible hacer lo siguiente:
$catIds = array_map(create_function('$o', 'return $o->id;'), $objects);
Pero cuidado: en las versiones más recientes de PHP >= 5.3.0es mejor usar Closures, como sigue:
$catIds = array_map(function($o) { return $o->id; }, $objects);
La diferencia
La primera solución crea una nueva función y la pone en su RAM. El recolector de basura no elimina de la memoria la instancia de función ya creada y llamada por alguna razón. Y eso, independientemente del hecho, que la instancia de función creada nunca se puede volver a llamar, porque no tenemos un puntero para ella. Y la próxima vez que se invoque este código, se volverá a crear la misma función. Este comportamiento llena lentamente tu memoria ...
Ambos ejemplos con salida de memoria para compararlos:
MALO
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
...
BUENO
while (true)
{
$objects = array_map(function($o) { return $o->id; }, $objects);
echo memory_get_usage() . "\n";
sleep(1);
}
// the output
4235136
4235168
4235168
4235168
...
Esto también se puede discutir aquí
¡¿Pérdida de memoria?! ¿Garbage Collector funciona correctamente cuando usa 'create_function' dentro de 'array_map'?