迭代多维数组

时间:2013-07-25 07:12:58

标签: php arrays multidimensional-array foreach

我正在尝试获取项目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
        )

)

3 个答案:

答案 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

答案 1 :(得分: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']

      }

 }

}

答案 2 :(得分:1)

您可以尝试以下方式:

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