2014-12-01 143 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

相關問題