【问题标题】:PHP - What is the best way to access a property of an object which is an array elementPHP - 访问作为数组元素的对象的属性的最佳方法是什么
【发布时间】:2017-10-18 15:22:32
【问题描述】:

我有一个对象,它是一个 JSON 对象数组。有点像这样,

$object = [
 {
   "id":1,
   "name":"blue",
   "order":4
  },
 {
   "id":2,
   "name":"green",
   "order":6
  },
 {
   "id":3,
   "name":"yellow",
   "order":2
  }
]

我想以一种简单的方式访问属性,单行可能是这样的,

如果我想要名称为“蓝色”的对象的“顺序”

$blue_order = $object[something]->[name="blue"]->order;

在这方面有点混合了 Jquery。但我希望你能理解。我现在最好的就是这个,

for($i=0; $i<count($object); $i++){
 if($object[$i]->name == "blue"){
  $blue_order = $object[$i]->order;
 }
}

这似乎非常低效,我不想使用循环,因为数组非常大,循环通过它会很慢。那我该怎么做呢?

我使用“for”循环而不是 foreach,因为数组可以为空。而且数组元素的顺序也不总是一样的。

所以我不能做类似的事情

$object[0]->order 

【问题讨论】:

    标签: php arrays json object


    【解决方案1】:
    <?php
    
    $arr = array(
     array('id'=>1,'name'=>'blue','order'=>4),
     array('id'=>2,'name'=>'green','order'=>6),
     array('id'=>3,'name'=>'yellow','order'=>2),    
    );
    
    // $json is JSON version of the arrays in $arr
    $json = json_encode($arr);
    
    // show $json
    echo $json . "\n";
    
    // create arrays from JSON so it can be used in PHP easier
    $obj = json_decode($json);
    
    $color = 'blue';
    $blue_order = array_filter($obj, function($i) use ($color) { return $i->name == $color; })[0]->order;
    
    echo "Blue Order: " . $blue_order;
    

    您也许可以使用 array_filter 来帮助它成为单线。我包括了 json_decode 和 json_encode,所以我可以有一个完整的例子。

    【讨论】:

      【解决方案2】:

      您仍然可以使用foreach,但首先检查数组是否为空,如下所示:

      if(!empty($object)){
        foreach($object as $element){
          if($element->name == "blue"){
            $blue_order = $element->order;
          }
        }
      }
      

      另外,你的代码对我来说看起来很高效,我可能会在你找到值后添加break,如下所示:

      if(!empty($object)){
        foreach($object as $element){
          if($element->name == "blue"){
            $blue_order = $element->order;
            break;
          }
        }
      }
      

      如果您的对象包含大量信息并且您将进行大量搜索,那么您可以进行一些预处理以便更容易搜索,如下所示:

      $object_by_name = array();
      if(!empty($object)){
        foreach($object as $element){
          $object_by_name[$element->name] = $element;
        }
      }
      

      然后,你可以这样搜索:

      if(!empty($object_by_name['blue'])){
        $blue_order = $object_by_name['blue']->order
      }
      

      【讨论】:

      • hmmmm...我喜欢你的预处理想法。我想我会试试的。谢谢
      • 酷,告诉我们进展如何
      • 虽然,我使用的数组非常大(我的意思是非常大),创建另一个这样的数组会有点低效。但我想这是我目前拥有的最好的。
      • 我认为休息会比创建另一个数组更好。你说什么?我很困惑。
      • 好吧,如果您在进行预处理后不需要第一个数组中的信息,那么您可以在放弃当前数字键的同时在同一数组中创建名称键。如果您搜索很多,我会说您应该进行预处理,但这实际上取决于数据
      【解决方案3】:

      保持简单。

      你写的代码太多了。

      $array_list = ($array_list)?:[];
      $array_list = array_filter($array_list,function($var) {
          return ($var->name=="blue");
      });
      $order = ($array_list)? $array_list[0]->order :'';
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-27
        • 1970-01-01
        • 2015-06-08
        • 2011-11-22
        • 1970-01-01
        • 2012-09-16
        相关资源
        最近更新 更多