【问题标题】:How to get object property from each object in an array?如何从数组中的每个对象获取对象属性?
【发布时间】:2011-06-24 00:36:43
【问题描述】:

假设我在 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)我可以手动循环,但我觉得一定有更好的方法。

刚刚看到this in the similar questions,但对于接受的答案是否真的是最好的方法存在一些争论,而且它是从 2 年前开始的。我在 PHP 5.3 上。

【问题讨论】:

  • 根据您的方案,您可能需要考虑使用associative array,而不是具有id 成员的对象数组。

标签: php


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    从 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 中引入的。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        我正在使用 RedBean,但由于某种原因传入“getID”对我不起作用,所以我是这样做的:

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

        【讨论】:

          【解决方案5】:

          您可以使用ouzo goodies轻松完成此操作

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

          或使用数组(来自茴香酒)

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

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

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

          【讨论】:

            【解决方案6】:

            你试过array_keys函数吗?

            编辑:

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

            【讨论】:

            • 在示例中,array_keys 将返回 [0,1,2] 而不是 [1,2,7]。但我想我可以将 ID 存储为数组键......
            • 是的,没错。我认为迭代是强制性的。如果您不想进行迭代,那么在任何情况下都可以使用诸如 array_map 之类的函数,这将导致调用回调函数(如@webbiedave 所报告的那样)导致不必要的开销。我正在通过添加“明显的解决方案”来编辑我的帖子。
            【解决方案7】:

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

            【讨论】:

              猜你喜欢
              • 2022-11-27
              • 2012-11-17
              • 2011-05-27
              • 1970-01-01
              • 2020-09-22
              • 2022-10-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多