Php 遍历多维数组
我试图获取项目id,然后获取该项目id中的所有选项名称/选项值。因此,我最终得到,id:123,颜色:蓝色,大小:6。ID:456,颜色:黄色,尺码:8。然而,我得到了正确的项目ID,但是选项名称/选项值没有正确通过,要么是空白的,要么只是一个随机字母 这是我不起作用的代码Php 遍历多维数组,php,arrays,multidimensional-array,foreach,Php,Arrays,Multidimensional Array,Foreach,我试图获取项目id,然后获取该项目id中的所有选项名称/选项值。因此,我最终得到,id:123,颜色:蓝色,大小:6。ID:456,颜色:黄色,尺码:8。然而,我得到了正确的项目ID,但是选项名称/选项值没有正确通过,要么是空白的,要么只是一个随机字母 这是我不起作用的代码 foreach($itemlist as $item) { echo $item['ID']; foreach($item as $option) { echo $option['opti
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
)
)
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"
}
排列
(
[1] =>阵列
(
[ID]=>123
[数量]=>1
[型号]=>sdfsd
[图片]=>
[1] =>阵列
(
[选项名称]=>颜色
[选项_值]=>蓝色
[期权价格]=>0.0000
)
[2] =>阵列
(
[选项名称]=>大小
[选项_值]=>6
[期权价格]=>0.0000
)
[价格]=>0
)
[2] =>阵列
(
[ID]=>456
[数量]=>0
[型号]=>gsdfgd
[图片]=>
[1] =>阵列
(
[选项名称]=>颜色
[选项_值]=>黄色
[期权价格]=>0.0000
)
[2] =>阵列
(
[选项名称]=>大小
[选项_值]=>8
[期权价格]=>0.0000
)
[价格]=>0
)
)
基本上,您在
$item
数组上循环,如下所示:
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
)
)
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\u 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'];
for ($i=1;isset($item[$i]);$i++)
{
foreach($item[$i] as $key => $option)
{
echo $key, ' => ', $option;
}
}
}
您可以将的循环替换为:
$i=0;//or $i = 1
while(isset($item[++$i]))// or isset($item[$i++]), if $i is 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']
}
}
}
您可以尝试以下方法:
array_walk_recursive($itemlist, function($value, $key) {
if (in_array($key, array("ID", "option_name", "option_value")))
echo "$key: $value\n";
});
我需要所有的选择,但我不知道有多少。可能是两个,也可能是四个,等等。有没有办法循环所有这些?您的代码可以工作,但只返回第一个选项集,在我的示例1和示例2中,我需要所有选项集的颜色和颜色size@user1155594:添加了如何解决此问题的完整示例。如果您确定带有选项值的子数组总是要分配给键1
,则可以省略foreach($sub项目)
,并使用foreach($key项目[1]作为$key=>$option)
,而不中断代码>语句,然后您不需要嵌套3个循环…您的第3个代码示例可以工作,但是使用break它只提供颜色,而不是颜色和大小。如果我删除中断符,它将为我提供整个数组中的所有颜色/大小,而不仅仅是id123@user1155594:听起来好像你把断路器放错地方了。最后一个代码段由3个嵌套循环组成。中断应该正好在第三个循环的外部,在第二个循环内部的if(is_array())
分支的内部loop@user1155594:哦,现在我明白了。。。抱歉:松开中断
确实有两个子数组($item[1]
,$item[2]
),每个子数组描述一个特定的选项。如果这些数组总是数字的,您可以使用for
循环,甚至可以使用while(isset($item[$i++])
。我将把你的问题编辑成问题中数组的一个更好的格式版本。注意,这需要PHP>=5.3,并在每次迭代中构造数组[ID,option\u name,option\u value]
,而且,由于lambda函数是对象这一事实,在我上次检查时并不是非常快