PHP - 从对象数组中提取属性

abe*_*ier 111 php

我有一系列猫对象:

$cats = Array
    (
        [0] => stdClass Object
            (
                [id] => 15
            ),
        [1] => stdClass Object
            (
                [id] => 18
            ),
        [2] => stdClass Object
            (
                [id] => 23
            )
)
Run Code Online (Sandbox Code Playgroud)

我想在一行中提取猫的ID数组(不是函数也不是循环).

我想使用array_walkcreate_function,但我不知道该怎么做.

任何的想法?

Gre*_*reg 149

你可以使用这个array_map()功能.
这应该这样做:

$catIds = array_map(create_function('$o', 'return $o->id;'), $objects);
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的解决方案,并将导致每个即将到来的维护者都是"wtf"d:D (51认同)
  • 在这里,我们去:`$ project_names = array_map(function($ project){return $ project-> name;},$ projects);`但是,请注意[在这篇博文中](http://willem.stuursma. name/2010/11/22/a-detailed-look-into-array_map-and-foreach /)这样可以慢2.5倍/内存密集. (24认同)
  • 我发现,每次使用`create_function`创建函数时,内存都在增长.如果你编写一个带有无限循环的程序并在其中调用带有`create_function`的`array_map`,你总会得到一个`Out of memory ...`错误.所以不要使用`create_function`并使用`array_map(function($ o){return $ o-> id;},$ objects);` (7认同)
  • 你可以使用lambda函数,但没有多少人会运行PHP 5.3 (4认同)
  • `create_function` 从 php 7.2 开始被弃用。 (4认同)
  • 我唯一不喜欢这个解决方案的是使用create_function. (3认同)

Jos*_*ina 114

如果你有PHP 5.5或更高版本,最好的方法是使用内置函数array_column():

$idCats = array_column($cats, 'id');
Run Code Online (Sandbox Code Playgroud)

但是儿子必须是一个数组或转换为数组

  • 这实际上是最好的答案 (11认同)
  • 这个解决方案没有回答这个问题,因为`array_column`根本不能与`object`的`array`一起使用.由于PHP 7.0.0是可能的:/sf/answers/1633515691/ (8认同)
  • 无论如何,任何人都不应该用5.5编码.3.5岁的编程语言版本...... (2认同)
  • 它仅在对象属性具有公共访问权限时才起作用。 (2认同)

alg*_*thm 79

解决方案取决于您使用的PHP版本.至少有两种解决方案:

第一个(较新的PHP版本)

正如@JosepAlsina所说,在最好和最短的解决方案之前使用array_column如下:

$catIds = array_column($objects, 'id');
Run Code Online (Sandbox Code Playgroud)

注意: 对于迭代问题中使用的array包含\stdClasses,只能使用PHP版本>= 7.0.但是当使用array包含arrays时,你可以做同样的事情,因为PHP >= 5.5.

第二个(较旧的PHP版本)

@Greg在较旧的PHP版本中表示可以执行以下操作:

$catIds = array_map(create_function('$o', 'return $o->id;'), $objects);
Run Code Online (Sandbox Code Playgroud)

但要注意:在较新的PHP版本中>= 5.3.0,最好使用Closures,如下所示:

$catIds = array_map(function($o) { return $o->id; }, $objects);
Run Code Online (Sandbox Code Playgroud)


区别

第一个解决方案创建一个新功能并将其放入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
...
Run Code Online (Sandbox Code Playgroud)

while (true)
{
    $objects = array_map(function($o) { return $o->id; }, $objects);

    echo memory_get_usage() . "\n";

    sleep(1);
}

// the output
4235136
4235168
4235168
4235168
...
Run Code Online (Sandbox Code Playgroud)


这也可以在这里讨论

内存泄漏?!垃圾收集器在'array_map'中使用'create_function'时是否正确?