솔루션은 사용중인 PHP 버전에 따라 다릅니다. 최소한 두 가지 솔루션이 있습니다.
먼저 (최신 PHP 버전)
@JosepAlsina가 전에 말했듯이 가장 짧은 해결책은 array_column
다음과 같이 사용 하는 것입니다.
$catIds = array_column($objects, 'id');
주의 : 질문에 사용 array
된 \stdClass
es를 포함하는
반복은 PHP 버전에서만 가능합니다 >= 7.0
. 그러나 array
포함하는 array
s를 사용하면 PHP부터 동일한 작업을 수행 할 수 있습니다 >= 5.5
.
두 번째 (이전 PHP 버전)
@Greg는 이전 PHP 버전에서 다음을 수행 할 수 있다고 말했습니다.
$catIds = array_map(create_function('$o', 'return $o->id;'), $objects);
그러나주의하십시오 : 최신 PHP 버전에서는 다음과 같이 s >= 5.3.0
를 사용하는 것이 좋습니다 Closure
.
$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'을 사용할 때 Garbage Collector가 제대로 작동합니까?