我有一系列猫对象:
$cats = Array
    (
        [0] => stdClass Object
            (
                [id] => 15
            ),
        [1] => stdClass Object
            (
                [id] => 18
            ),
        [2] => stdClass Object
            (
                [id] => 23
            )
)
我想在一行中提取猫的ID数组(不是函数也不是循环).
我想使用array_walk带create_function,但我不知道该怎么做.
任何的想法?
Gre*_*reg 149
你可以使用这个array_map()功能.
这应该这样做:
$catIds = array_map(create_function('$o', 'return $o->id;'), $objects);
Jos*_*ina 114
如果你有PHP 5.5或更高版本,最好的方法是使用内置函数array_column():
$idCats = array_column($cats, 'id');
但是儿子必须是一个数组或转换为数组
alg*_*thm 79
解决方案取决于您使用的PHP版本.至少有两种解决方案:
正如@JosepAlsina所说,在最好和最短的解决方案之前使用array_column如下:
$catIds = array_column($objects, 'id');
注意: 
对于迭代问题中使用的array包含\stdClasses,只能使用PHP版本>= 7.0.但是当使用array包含arrays时,你可以做同样的事情,因为PHP >= 5.5.
@Greg在较旧的PHP版本中表示可以执行以下操作:
$catIds = array_map(create_function('$o', 'return $o->id;'), $objects);
但要注意:在较新的PHP版本中>= 5.3.0,最好使用Closures,如下所示:
$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'时是否正确?
| 归档时间: | 
 | 
| 查看次数: | 79692 次 | 
| 最近记录: |