Çözüm, kullandığınız PHP sürümüne bağlıdır. En azından 2 çözüm var:
İlk (Daha yeni PHP sürümleri)
@JosepAlsina'nın daha önce söylediği gibi, en iyi ve en kısa çözüm array_columnaşağıdaki gibi kullanmaktır :
$catIds = array_column($objects, 'id');
Not: Soru içinde kullanıldığı gibi arrayiçeren
bir es'i yinelemek için \stdClassbu sadece PHP sürümleri ile mümkündür >= 7.0. Ancak, arrayiçeren bir URL kullanırken arrayaynı şeyi PHP'den beri yapabilirsiniz >= 5.5.
İkinci (Eski PHP sürümleri)
@Greg, eski PHP sürümlerinde aşağıdakileri yapmanın mümkün olduğunu söyledi:
$catIds = array_map(create_function('$o', 'return $o->id;'), $objects);
Ancak dikkatli olun: Daha yeni PHP sürümlerinde >= 5.3.0aşağıdaki Closuregibi s kullanmak daha iyidir :
$catIds = array_map(function($o) { return $o->id; }, $objects);
Fark
İlk çözüm yeni bir işlev oluşturur ve bunu RAM'inize yerleştirir. Çöp toplayıcı, önceden oluşturulmuş ve önceden çağrılmış işlev örneğini herhangi bir nedenle bellekten silmez. Ve yaratılan işlev örneğinin bir daha asla çağrılamayacağı gerçeğine bakılmaksızın, çünkü onun için göstericimiz yok. Ve bir dahaki sefere bu kod çağrıldığında, aynı işlev yeniden yaratılacaktır. Bu davranış yavaş yavaş hafızanızı doldurur ...
Karşılaştırmak için bellek çıkışlı her iki örnek:
KÖTÜ
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
...
İYİ
while (true)
{
$objects = array_map(function($o) { return $o->id; }, $objects);
echo memory_get_usage() . "\n";
sleep(1);
}
// the output
4235136
4235168
4235168
4235168
...
Bu ayrıca burada tartışılabilir
Bellek sızıntısı?! Garbage Collector, 'array_map' içinde 'create_function' kullanılırken doğru yapıyor mu?