4

我正在尝试获取项目 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看起来像这样:

大批
(
    [1] => 数组
        (
            [ID] => 123
            [数量] => 1
            [型号] => sdfsd
            [图像] =>
            [1] => 数组
                (
                    [option_name] => 颜色
                    [option_value] => 蓝色
                    [option_price] => 0.0000
                )

            [2] => 数组
                (
                    [option_name] => 大小
                    [选项值] => 6
                    [option_price] => 0.0000
                )

            [价格] => 0
        )

    [2] => 数组
        (
            [ID] => 456
            [数量] => 0
            [型号] => gsdfgd
            [图像] =>
            [1] => 数组
                (
                    [option_name] => 颜色
                    [option_value] => 黄色
                    [option_price] => 0.0000
                )

            [2] => 数组
                (
                    [option_name] => 大小
                    [选项值] => 8
                    [option_price] => 0.0000
                )

            [价格] => 0
        )

)
4

3 回答 3

10

基本上,您正在遍历$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"
      }

所以在第一次迭代时,$optionwill be 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
于 2013-07-25T07:19:43.143 回答
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']

      }

 }

}
于 2013-07-25T07:20:33.773 回答
1

您可以尝试以下方法:

array_walk_recursive($itemlist, function($value, $key) {
    if (in_array($key, array("ID", "option_name", "option_value")))
        echo "$key: $value\n";
});
于 2013-07-25T07:21:41.947 回答