问题 如何从数组中的每个对象获取对象属性?


假设我在PHP中有一个对象数组,例如:

Array (
    [0] => stdClass Object (
            [id] => 1
            [name] => Title One
        )    
    [1] => stdClass Object (
            [id] => 2
            [name] => Title Two
        )

    [2] => stdClass Object (
            [id] => 7
            [name] => Title Seven
        )
)

获取ID数组的最佳方法(即最快)是什么?即 array(1,2,7) 我可以手动循环,但我觉得必须有一个更好的方法。

刚看到 这在类似的问题中 但是对于接受的答案是否真的是最好的方式还有一点争论,加上它是从2年前开始的。我在PHP 5.3上。


12179
2018-06-24 00:36


起源

根据您的情况,您可能需要考虑使用 关联数组 而不是带有一个对象的数组 id 会员。 - Joey Adams


答案:


最快的方法就是循环(foreachforwhile)。使用回调函数会产生不必要的开销。

我想看看是否有办法通过构建初始对象数组的代码创建列表。


3
2018-06-24 00:43





您可以使用 array_map 从每个元素获取ID。

function getID($a){
   return $a->id;
}
$IDs = array_map('getID', $array);

演示: http://ideone.com/nf3ug


8
2018-06-24 15:20





从PHP 7.0开始,您可以使用内置函数 array_column 为此,它采用输入数组和您要采摘的属性的名称:

$ids = array_column($input, 'id');
// array(0 => 1, 1 => 2, 2 => 7)

作为第三个参数,您也可以选择提供索引键:

$ids = array_column($input, 'name', 'id');
// array(1 => 'Title One', 2 => 'Title Two', 7 => 'Title Seven')

请注意,虽然它已经在PHP 5.5.0中可用,但是在PHP 7.0中首次引入了对对象数组的支持。


4
2018-06-09 07:23





你可以轻松地做到 ouzo好吃的东西

$result = array_map(Functions::extract()->id, $objects);

或与阵列(来自ouzo goodies)

$result = Arrays::map($objects, Functions::extract()->id);

查看: http://ouzo.readthedocs.org/en/latest/utils/functions.html#extract

另请参阅使用ouzo进行函数式编程(我无法发布链接)。


1
2018-01-07 15:52





你试过吗? array_keys 功能?

编辑:

<?php 
   $ids = array();
   for($c=0; $c<count($the_array); $c++) $ids[$c] = $the_array[$c]->id;
?>

0
2018-06-24 01:46



在这个例子中, array_keys 会回来的 [0,1,2] 不 [1,2,7]。但我想我可以将ID存储为数组键... - DisgruntledGoat
恩,那就对了。我认为迭代是强制性的。如果你不想迭代,在任何情况下使用像array_map这样的函数都会为你做这件事,这会因调用回调函数而引起不必要的开销(由@webbiedave报告)。我正在通过添加“明显的解决方案”来编辑我的帖子。 - bitfox


你也可以使用 extract_property() 这是一个专门为这项工作设计的经过良好测试的图书馆(免责声明:我是作者)。


0
2017-07-11 07:09





我正在使用RedBean,由于某些原因,传入“getID”对我来说不起作用,所以这是我如何做到的:

$ids = array_map(function($val){return $val->id;}, $objects);

0
2017-12-09 05:40