解決策は、使用しているPHPのバージョンによって異なります。少なくとも2つの解決策があります。
最初(新しいPHPバージョン)
@JosepAlsinaが前に言ったように、最善かつ最短の解決策はarray_column
次のように使用することです:
$catIds = array_column($objects, 'id');
注意:質問で使用されているようにarray
包含\stdClass
esを
反復する場合、PHPバージョンでのみ可能です>= 7.0
。しかし、array
包含array
sを使用する場合、PHPから同じことができます>= 5.5
。
2番目(古いPHPバージョン)
@Gregは、古いバージョンのPHPでは次のことを実行できると述べています。
$catIds = array_map(create_function('$o', 'return $o->id;'), $objects);
ただし、注意してください。新しいPHPバージョン>= 5.3.0
ではClosure
、次のようにs を使用することをお勧めします。
$catIds = array_map(function($o) { return $o->id; }, $objects);
違い
最初のソリューションは、新しい関数を作成してRAMに配置します。ガベージコレクターは、何らかの理由で、既に作成され、既に呼び出されている関数インスタンスをメモリから削除しません。事実に関係なく、作成された関数インスタンスは、ポインターがないため、再度呼び出すことはできません。そして、次にこのコードが呼び出されたときに、同じ関数が再度作成されます。この動作はゆっくりとあなたの記憶を満たします...
それらを比較するためのメモリ出力の両方の例:
悪い
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
...
良い
while (true)
{
$objects = array_map(function($o) { return $o->id; }, $objects);
echo memory_get_usage() . "\n";
sleep(1);
}
// the output
4235136
4235168
4235168
4235168
...
これもここで議論されるかもしれません
メモリーリーク?!'array_map'内で 'create_function'を使用すると、ガベージコレクターは正しく動作しますか?