iterating through multi dimensional arrays

前端 未结 3 1057
不知归路
不知归路 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:43

    This is because your array contains the POSSIBILITY of those keys existing, not guaranteed. There's a few different approaches you could take, such as checking if the key is numeric (seems only numeric keys have the correct array of keys set). But since i dont know your dataset, probably the best universal method is to change your code to check if the key's are set, before trying to use them. So..

    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']
    
          }
    
     }
    
    }
    
    0 讨论(0)
  • 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
    
    0 讨论(0)
  • 2020-12-19 18:05

    You could try something like:

    array_walk_recursive($itemlist, function($value, $key) {
        if (in_array($key, array("ID", "option_name", "option_value")))
            echo "$key: $value\n";
    });
    
    0 讨论(0)
提交回复
热议问题