解决方案取决于您使用的PHP版本。至少有2种解决方案:
第一种(较新的PHP版本)
正如@JosepAlsina之前所说,最好且最简短的解决方案是使用array_column
,具体如下:
$catIds = array_column($objects, 'id');
注意:
对于在问题中使用的包含stdClass的数组进行迭代,只有在PHP版本>= 7.0时才可能。但是,当使用包含数组的数组时,自PHP版本>= 5.5以来也可以做同样的事情。
第二部分(较旧的PHP版本):
@Greg说,在较旧的PHP版本中,可以按照以下方式操作:
$catIds = array_map(create_function('$o', 'return $o->id;'), $objects);
但要小心: 在较新的PHP版本中>= 5.3.0
最好使用Closure
,如下所示:
$catIds = array_map(function($o) { return $o->id; }, $objects);
区别
使用create_function()
的解决方案会创建一个新函数并将其放入RAM中。出于某种原因,垃圾收集器不会从内存中删除已经创建和调用过的函数实例。而且,无论如何,由于没有指针可以调用已创建的函数实例,下次调用此代码时,将再次创建相同的函数。这种行为会逐渐填满您的内存...
将两个示例的内存输出进行比较:
糟糕的
while (true)
{
$objects = array_map(create_function('$o', 'return $o->id;'), $objects);
echo memory_get_usage() . "\n";
sleep(1);
}
4235616
4236600
4237560
4238520
...
好的
while (true)
{
$objects = array_map(function($o) { return $o->id; }, $objects);
echo memory_get_usage() . "\n";
sleep(1);
}
4235136
4235168
4235168
4235168
...
这个问题也可以在这里讨论
内存泄漏?!在使用'create_function'和'array_map'时,垃圾回收器是否正确工作?