Rozwiązanie zależy od używanej wersji PHP. Istnieją przynajmniej 2 rozwiązania:
Pierwsza (nowsze wersje PHP)
Jak powiedział wcześniej @JosepAlsina, najlepszym i zarazem najkrótszym rozwiązaniem jest użycie array_column
:
$catIds = array_column($objects, 'id');
Uwaga:
W celu iteracji array
zawierającego \stdClass
es, jak użyto w pytaniu, jest to możliwe tylko w wersjach PHP >= 7.0
. Ale używając array
zawierającego array
s, możesz zrobić to samo od PHP>= 5.5
.
Po drugie (starsze wersje PHP)
@Greg powiedział, że w starszych wersjach PHP można wykonać następujące czynności:
$catIds = array_map(create_function('$o', 'return $o->id;'), $objects);
Ale strzeż się: nowszych wersjach PHP >= 5.3.0
lepiej jest używać Closure
s, jak na przykład:
$catIds = array_map(function($o) { return $o->id; }, $objects);
Różnica
Pierwsze rozwiązanie tworzy nową funkcję i umieszcza ją w pamięci RAM. Z jakiegoś powodu moduł odśmiecania pamięci nie usuwa już utworzonej i wywołanej instancji funkcji z pamięci. I to niezależnie od tego, że utworzonej instancji funkcji nie da się już nigdy ponownie wywołać, bo nie mamy na nią wskaźnika. Następnym razem, gdy ten kod zostanie wywołany, ta sama funkcja zostanie ponownie utworzona. To zachowanie powoli wypełnia twoją pamięć ...
Oba przykłady z wyjściem pamięci, aby je porównać:
ZŁY
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
...
DOBRY
while (true)
{
$objects = array_map(function($o) { return $o->id; }, $objects);
echo memory_get_usage() . "\n";
sleep(1);
}
// the output
4235136
4235168
4235168
4235168
...
Można to również omówić tutaj
Wyciek pamięci?! Czy Garbage Collector działa dobrze, gdy używa się funkcji „create_function” w obrębie „array_map”?