iterating through multi dimensional arrays

前端 未结 3 1064
不知归路
不知归路 2020-12-19 17:32

I am trying to get the item id, and then all option_name/option_values within that item id. So I end up with, ID: 123, Color: Blue, Size: 6. ID: 456, Color: Yellow, Size: 8.

3条回答
  •  臣服心动
    2020-12-19 17:50

    Basically, you're looping over the $item array, which looks like this:

    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"
          }
    

    So on the first iteration, $option will be 123, trying to access '123'['option_name'] will issue a warning. What you actually wanted to do is this:

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

    That's why your code doesn't produce the desired result.
    If the sub-array doesn't always have 1 as a key, try:

    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.
        }
    }
    

    Here's the most generic approach to get all options (irrespective of how many)

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

    But seeing as your options arrays look like they all have numeric indexes, you could just as well try this:

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

    You could replace the for loop with:

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

提交回复
热议问题