2014-12-01 98 views
0

对于穷术语的道歉,不能想出正确的词来描述这个问题,所以这个例子应该更有用。访问具有相同名称的PHP对象变量?

我在轮询一个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现场发现运行一系列的检查来查找匹配字段标签和匹配的变量。有没有更好的方法来做到这一点和/或上述代码的工作?

回答

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' => '...', ...); 
0

也许最好是使用一个开关case语句这样

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 
} 

因为编译器是不是if语句优化switch语句更好。在if-else语句的情况下,编译器不知道评估if语句的顺序对您是否重要,并且无法在其中执行任何优化。你可以在if语句中调用方法,影响变量。通过switch语句,它知道所有子句可以同时进行评估,并且可以以最有效的顺序放置它们。

Comparison between switch and if else

+0

OP是否有性能问题?虽然'switch'语句没有错,但您的论证听起来很像[过早优化](http://c2.com/cgi/wiki?PrematureOptimization)。 – 2014-12-01 17:07:18

相关问题