PHP - 访问作为数组元素的对象的属性的最佳方法是什么

时间:2017-10-18 15:22:33

标签: php arrays json object

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

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

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

  

说我是否想要名称为“blue”的对象的“顺序”

     
    

$ 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,因为数组可以为null。并且数组元素的顺序也不会总是相同。

所以我不能做像

这样的事情
$object[0]->order 

3 个答案:

答案 0 :(得分:0)

您仍然可以使用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
}

答案 1 :(得分:0)

保持简单。

你写的代码太多了。

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

快乐编码

答案 2 :(得分:0)

<?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,所以我可以有一个完整的例子。