A solução depende da versão do PHP que você está usando. Pelo menos existem 2 soluções:
Primeiro (versões mais recentes do PHP)
Como o @JosepAlsina disse antes, a melhor e mais curta solução é usar da array_column
seguinte maneira:
$catIds = array_column($objects, 'id');
Nota:
Para iterar um es array
contendo, \stdClass
conforme usado na pergunta, só é possível com versões do PHP >= 7.0
. Mas ao usar um s array
contendo array
você pode fazer o mesmo desde o PHP >= 5.5
.
Segundo (versões mais antigas do PHP)
O @Greg disse que em versões mais antigas do PHP é possível fazer o seguinte:
$catIds = array_map(create_function('$o', 'return $o->id;'), $objects);
Mas cuidado: nas versões mais recentes do PHP >= 5.3.0
é melhor usar Closure
s, como se segue:
$catIds = array_map(function($o) { return $o->id; }, $objects);
A diferença
A primeira solução cria uma nova função e a coloca na sua RAM. O coletor de lixo não exclui a instância da função já criada e chamada de memória por algum motivo. E isso, independentemente do fato, que a instância da função criada nunca poderá ser chamada novamente, porque não temos ponteiros para ela. E na próxima vez em que esse código for chamado, a mesma função será criada novamente. Esse comportamento preenche lentamente sua memória ...
Ambos os exemplos com saída de memória para compará-los:
RUIM
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
...
BOA
while (true)
{
$objects = array_map(function($o) { return $o->id; }, $objects);
echo memory_get_usage() . "\n";
sleep(1);
}
// the output
4235136
4235168
4235168
4235168
...
Isso também pode ser discutido aqui
Vazamento de memória?! O Garbage Collector está fazendo certo ao usar 'create_function' em 'array_map'?