访问具有相同名称的PHP对象变量?

时间:2014-12-01 16:37:27

标签: php arrays object

对于糟糕的术语表示歉意,不能想出用于描述此问题的正确词语,因此这个例子应该更有用。

我正在轮询API服务器并返回一个JSON对象,我已经使用json_decode将其转换为PHP对象。

xml格式的返回结果示例如下:http://balifoodsafari.com.au/RGJ4QHE.xml

在此结果中,在booking->字段下有多个字段子集,每个字段都有自己的标签和值。我需要处理这些并将正确的字段值分配给正确的变量,并且我不能保证每次轮询API服务器时字段的顺序都相同。

我的想法,因为我写这个就像是:

foreach($decoded->booking->fields->field as $field){
   if($field->label == "Name of Hotel / Accommodation"){
       $hotelname = $field->value;
   }
   elseif(){repeat for 2nd field name}
   elseif(){repeat for 3rd field name}
   elseif(){repeat for 4th field name}
}

基本上,找到的foreach字段会运行一系列检查以找到匹配的字段标签并匹配变量。有没有更好的方法来执行此操作和/或上面的代码是否有效?

2 个答案:

答案 0 :(得分:0)

如果不是分配给变量,而是使用关联数组呢?

$fieldNames = array(
  'Name of Hotel / Accommodation' => 'hotelname',
  // ...
);

$fields = array();

foreach($decoded->booking->fields->field as $field){
    if (isset($fieldNames($field->label)) {
        $fields[$fieldNames[$field->label]] = $field->value;
    }
}

// $fields will be something like array('hotelname' => '...', ...);

答案 1 :(得分:0)

可能最好使用像这样的开关案例语句

switch($field->label) {
    case "fieldLabel1":
        //First if cond
        break;
    case "fieldLabel2":
        //2nd if cond
        break;
    case "fieldLabel3":
        //third if cond
        break;
    case "fieldLabel4":
        //fourth cond
        break;
    default:
        //else cond
}

因为编译器在优化switch语句方面优于if语句。在if-else语句的情况下,编译器不知道评估if语句的顺序对您是否重要,并且不能在那里执行任何优化。您可以在if语句中调用方法,从而影响变量。使用switch语句,它知道所有子句可以同时进行评估,并且可以按照最有效的顺序放置它们。

Comparison between switch and if else