2013-06-27 75 views
1

大家好我有一個頁面到PHP,我從服務器檢索XML數據,我想將這些數據存儲到一個數組中。創建數組嵌套的PHP

這是我的代碼:

foreach ($xml->DATA as $entry){ 
    foreach ($entry->HOTEL_DATA as $entry2){ 
     $id = (string)$entry2->attributes()->HOTEL_CODE; 
     $hotel_array2 = array(); 
     $hotel_array2['id'] = $entry2->ID; 
      $hotel_array2['name'] = utf8_decode($entry2->HOTEL_NAME); 
     $i=0; 
     foreach($entry2->ROOM_DATA as $room){ 
      $room_array = array(); 
      $room_array['id'] = (string)$room->attributes()->CCHARGES_CODE; 
      $hotel_array2['rooms'][$i] = array($room_array); 

      $i++; 
     } 
      array_push($hotel_array, $hotel_array2); 
     } 
} 

在這種模式下我有數組hotel_array所有酒店客房帶。 問題是:在我的XML中,我可以擁有多個具有相同ID(相同酒店)的酒店,但信息相同但房間不同。 如果我有一個酒店,我已經插入到我的hotel_array我不想插入一個新的數組,但我只想把它的房間陣列,並插入到現有的酒店。 實例現在我的情況是:

hotel_array{ 
     [0]{ 
      id = 1, 
      name = 'test' 
      rooms{ 
       id = 1 
      } 
     } 
     [0]{ 
      id = 2, 
      name = 'test2' 
      rooms{ 
       id = 100 
      } 
     } 
     [0]{ 
      id = 1, 
      name = 'test' 
      rooms{ 
       id = 30 
      } 
     } 
} 

我想有這樣的結果,而不是:

hotel_array{ 
     [0]{ 
      id = 1, 
      name = 'test' 
      rooms{ 
       [0]{ 
        id = 1 
       } 
       [1]{ 
        id = 30 
       } 
      } 
     } 
     [0]{ 
      id = 2, 
      name = 'test2' 
      rooms{ 
       id = 100 
      } 
     } 
} 

如何創建一個這樣的數組?

感謝

+1

使用關聯數組,其中ID是關鍵。然後檢查元素是否已經存在,並添加新房間而不是創建新元素。 – Barmar

+0

在http://stackoverflow.com/questions/17336004/php-array-merge中查看我的回答,發現類似的問題,他希望在具有相同ID的條目中添加一個元素。 – Barmar

+0

Thanks @Barmar謝謝我已經看到這是另一個很好的解決方案 –

回答

2

第一件事就是它有助於保持酒店id作爲指數hotel_array當你創建它。

foreach ($xml->DATA as $entry){ 
    foreach ($entry->HOTEL_DATA as $entry2){ 
     $id = (string)$entry2->attributes()->HOTEL_CODE; 
     $hotel_array2 = array(); 
     $hotel_array2['id'] = $entry2->ID; 
      $hotel_array2['name'] = utf8_decode($entry2->HOTEL_NAME); 
     $i=0; 
     foreach($entry2->ROOM_DATA as $room){ 
      $room_array = array(); 
      $room_array['id'] = (string)$room->attributes()->CCHARGES_CODE; 
      $hotel_array2['rooms'][$i] = array($room_array); 

      $i++; 
     } 
      if (!isset($hotel_array[$hotel_array2['id']])) { 
        $hotel_array[$hotel_array2['id']] = $hotel_array2; 
      } else { 
        $hotel_array[$hotel_array2['id']]['rooms'] = array_merge($hotel_array[$hotel_array2['id']]['rooms'], $hotel_array2['rooms']); 
      } 
     } 
} 
+0

這個作品感謝+1對於quikly正確的答案 –

1

雖然這是類似的答案DevZer0(+1),也有相當多的可以做,以簡化您的工作方式......有沒有必要使用array_merge爲一體,或者是特定的約在您的房間陣列中的$i

$hotels = array(); 
foreach ($xml->DATA as $entry){ 
    foreach ($entry->HOTEL_DATA as $entry2){ 
    $id = (string) $entry2->attributes()->HOTEL_CODE; 
    if (empty($hotels[$id])) { 
     $hotels[$id] = array(
     'id' => $id, 
     'name' => utf8_decode($entry2->HOTEL_NAME), 
     'rooms' => array(), 
    ); 
    } 
    foreach($entry2->ROOM_DATA as $room){ 
     $hotels[$id]['rooms'][] = array(
     'id' => (string) $room->attributes()->CCHARGES_CODE; 
    ); 
    } 
    } 
} 

萬一它可以幫助...

+0

它可以比array_merge更快嗎? –

+0

+1 This works thanks –

+0

@AlessandroMinoccheri - 無後顧之憂。關於'array_merge',我的意思是,如果你在構建數組的時候創建了數組,而不是構建單獨的數組(然後你必須合併),那麼它會更加優化。但是,總是有很多方法來達到相同的結果:) – Pebbl

0

這:)

$hotel_array = array(); 

foreach ($xml->DATA as $entry) 
{ 
    foreach ($entry->HOTEL_DATA as $entry2) 
    { 
     $hotel_code = (string) $entry2->attributes()->HOTEL_CODE; 

     if (false === isset($hotel_array[$hotel_code])) 
     { 
      $hotel = array(
       'id' => $entry2->ID, 
       'code' => $hotel_code, 
       'name' => utf8_decode($entry2->HOTEL_NAME) 
      ); 

      foreach($entry2->ROOM_DATA as $room) 
      { 
       $hotel['rooms'][] = array(
        'id' => (string)$room->attributes()->CCHARGES_CODE, 
       ); 
      } 

      $hotel_array[$hotel_code] = $hotel; 
     } 
    } 
} 
+1

只是讓你知道你的代碼中有一個邏輯錯誤。你的'if'陳述意味着隨後的酒店(重複)不會增加他們的房間。你需要將'foreach'房間移到'if'外,那麼它應該工作:) – Pebbl

+0

10x :)但是,如果沒有初始xml數據,很難說。我的版本只是爲了更簡單的邏輯圖。 –