2013-07-25 77 views
3

我想獲得項目ID,然後在該項目ID內的所有option_name/option_values。所以我最終得到了ID:123,顏色:藍色,尺寸:6. ID:456,顏色:黃色,大小:8.但是我得到正確的項目ID,但是option_name/option_value沒有正確傳入,空白或只是一個隨機字母。迭代通過多維數組

這裏是我的代碼無法正常工作,

foreach($itemlist as $item) 
{ 
    echo $item['ID']; 

    foreach($item as $option) 
    { 
     echo $option['option_name']; 
     echo $option['option_value']; 
    } 
} 

$itemlist看起來是這樣的:

 
Array 
(
    [1] => Array 
     (
      [ID] => 123 
      [QTY] => 1 
      [MODEL] => sdfsd 
      [IMAGE] => 
      [1] => Array 
       (
        [option_name] => Color 
        [option_value] => Blue 
        [option_price] => 0.0000 
       ) 

      [2] => Array 
       (
        [option_name] => Size 
        [option_value] => 6 
        [option_price] => 0.0000 
       ) 

      [price] => 0 
     ) 

    [2] => Array 
     (
      [ID] => 456 
      [QTY] => 0 
      [MODEL] => gsdfgd 
      [IMAGE] => 
      [1] => Array 
       (
        [option_name] => Color 
        [option_value] => Yellow 
        [option_price] => 0.0000 
       ) 

      [2] => Array 
       (
        [option_name] => Size 
        [option_value] => 8 
        [option_price] => 0.0000 
       ) 

      [price] => 0 
     ) 

) 

回答

8

基本上,你遍歷了$item陣列,它看起來像這樣:

array(7) { 
    ["ID"]=>string(6) "123" 
    ["QTY"]=>string(1) "1" 
    ["MODEL"]=>string(11) "sdfsd" 
    ["IMAGE"]=>string(0) "" 
    [1]=> 
     array(3) { 
      ["option_name"]=>string(8) "Color" 
      ["option_value"]=>string(10) "Blue" 
      ["option_price"]=>string(6) "0.0000" 
     } 

因此在第一次迭代中,$option將會是123,試圖訪問'123'['option_name']會發出警告。你真正想要做的是:

foreach($item[1] as $key => $option) 
{ 
    if ($key !== 'option_price') 
    { 
     echo $option; 
    } 
} 
//or: 
echo $item['ID'], $item[1]['option_name'], $item['option_value']; 

這就是爲什麼你的代碼不會產生所需的結果。
如果子陣列並不總是有1作爲重點,嘗試:

foreach($item as $foo) 
{ 
    if (is_array($foo)) 
    { 
     echo $foo['option_name'], $foo['option_value']; 
     break;//we have what we needed, no need to continue looping. 
    } 
} 

這裏是最通用的方法來獲取所有選項(無論多少)

foreach($itemlist as $item) 
{ 
    echo $item['ID']; 
    foreach($item as $sub) 
    { 
     if (is_array($sub)) 
     { 
      foreach($sub as $key => $option) 
      { 
       echo $key, ' => ', $option; 
      } 
     } 
    } 
} 

但看到爲您的選擇陣列看起來像他們都具有數字索引,你也可以同樣試試這個:

foreach($itemlist as $item) 
{ 
    echo $item['ID']; 
    for ($i=1;isset($item[$i]);$i++) 
    { 
     foreach($item[$i] as $key => $option) 
     { 
      echo $key, ' => ', $option; 
     } 
    } 
} 

你可以更換for循環與:

$i=0;//or $i = 1 
while(isset($item[++$i]))// or isset($item[$i++]), if $i is 1 
+0

我需要的,雖然所有的選擇和IM不知道有多少會出現。可能是兩個,可能是四個等等。有沒有辦法循環所有這些方法?你的代碼有效,但只返回第一個選項集,我需要所有這些,在我的示例1和2中,顏色和大小 – user1155594

+0

@ user1155594:添加了一個完整的示例來說明如何解決此問題。如果你確定帶有選項值的子數組總是要分配給鍵'1',那麼你可以省去foreach($ item as $ sub)'和正確使用'foreach($ item [1]作爲$ key => $ option)',沒有任何'break;'語句,然後你不需要嵌套3個循環... –

+0

你的第三個代碼示例的工作原理是,但是隻有中斷它纔給出顏色,而不是顏色和大小。如果我刪除中斷,它會給我整個數組中的每種顏色/大小,而不僅僅是用於編號123 – user1155594

1

這是因爲你的數組包含這些密鑰存在,不保證的可能性。您可以採取幾種不同的方法,例如檢查鍵是否爲數字(似乎只有數字鍵具有正確的鍵集)。但是因爲我不知道你的數據集,可能最好的通用方法是在嘗試使用它們之前,更改你的代碼以檢查密鑰是否已設置。所以..

foreach($itemlist as $item) { 

foreach($item as $key => $value) { 

     if(is_array($value) && array_key_exists('option_name', $value) { 

      //--- Your option array is available in here via $value['option_x'] 

     } 

} 

} 
1

你可以嘗試這樣的:

array_walk_recursive($itemlist, function($value, $key) { 
    if (in_array($key, array("ID", "option_name", "option_value"))) 
     echo "$key: $value\n"; 
}); 
+0

請注意,這需要PHP> = 5.3,並在每次迭代中構造數組'[ID,option_name,option_value]',並且由於lambda函數是對象,並不是非常快,我上次檢查 –