通过多维数组迭代 [英] iterating through multi dimensional arrays

查看:101
本文介绍了通过多维数组迭代的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想获得该项目的ID,然后该项目的ID内的所有OPTION_NAME / option_values​​。所以,我结束了,ID:123,颜色:蓝色,大小:6 ID:456,颜色:黄色,尺寸:8。但是我收到正确的项目编号,但OPTION_NAME /请将option_value不是通过正常来临,无论是空或只是一个随机的信。

下面是我的code不起作用,

 的foreach($ ITEMLIST为$项)
{
   回声$项目['身份证'];   的foreach($为$选择项)
   {
       回声$选项['OPTION_NAME'];
       回声$选项['请将option_value'];
   }
 }

其中, $ ITEMLIST 是这样的:


排列

    [1] =>阵列
        (
            [ID] => 123
            [QTY] => 1
            [产品型号] => sdfsd
            [IMAGE] =>
            [1] =>阵列
                (
                    [OPTION_NAME] =>颜色
                    [请将option_value] =>蓝色
                    [option_price] => 0.0000
                )            [2] =>阵列
                (
                    [OPTION_NAME] =>大小
                    [请将option_value] => 6
                    [option_price] => 0.0000
                )            [价格] => 0
        )    [2] =>阵列
        (
            [ID] => 456
            [QTY] => 0
            [产品型号] => gsdfgd
            [IMAGE] =>
            [1] =>阵列
                (
                    [OPTION_NAME] =>颜色
                    [请将option_value] =>黄色
                    [option_price] => 0.0000
                )            [2] =>阵列
                (
                    [OPTION_NAME] =>大小
                    [请将option_value] => 8
                    [option_price] => 0.0000
                )            [价格] => 0
        ))


解决方案

基本上,你遍历了 $项目阵列,它看起来像这样:

 阵列(7){
   [ID] =>字符串(6)123
   [QTY] =>串(1)为1
   [MODEL] =>字符串(11)sdfsd
   [形象] =>字符串(0)
   [1] =>
       阵列(3){
           [OPTION_NAME] =>字符串(8)颜色
           [请将option_value] =>串(10),蓝
           [option_price] =>字符串(6)0.0000
      }

因此​​,在第一次迭代, $选项 123 ,试图访问 '123'['OPTION_NAME'] 将发出警告。你真正想做的事是这样的:

 的foreach($项目[1] $关键=> $选项)
{
    如果($关键!=='option_price')
    {
        回声$选项;
    }
}
//要么:
回声$项目['身份证'],$项目[1] ['OPTION_NAME'],$项目['请将option_value'];

这就是为什么你的code不会产生预期的结果。

如果子阵列并不总是有 1 作为重点,尝试:

 的foreach($项目为$富)
{
    如果(is_array($富))
    {
        回声$ foo的['OPTION_NAME'],$ foo的['请将option_value'];
        打破; //我们有我们所需要的,没有必要继续循环。
    }
}

下面是最通用的方法来获取所有选项(无论多少)

 的foreach($ ITEMLIST为$项)
{
    回声$项目['身份证'];
    的foreach($为$分项)
    {
        如果(is_array($子))
        {
            的foreach($子为$关键=> $选项)
            {
                回声$键,'=> ',$​​选项;
            }
        }
    }
}

但看到你的选择阵列看起来像他们都具有数字索引,你也可以同样试试这个:

 的foreach($ ITEMLIST为$项)
{
    回声$项目['身份证'];
    为($ i = 1;使用isset($项目[$ i]); $ I ++)
    {
        的foreach($项目[$ i]为$关键=> $选项)
        {
            回声$键,'=> ',$​​选项;
        }
    }
}

您可以替换为循环:

  $ I = 0; //或$ I = 1
而(使用isset($项目[++ $ i]))//或使用isset($项目[$ I ++]),如果$ i是1

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. However I am getting the correct item ID, but the option_name/option_value isn't coming through correctly, either blank or just one random letter.

Here's my code that doesn't work,

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

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

Where $itemlist looks like this:

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
        )

)

解决方案

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

这篇关于通过多维数组迭代的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆