2013-07-25 78 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函数是对象,并不是非常快,我上次检查 –