Я пытаюсь получить идентификатор элемента, а затем все options_name / option_values внутри этого элемента id. Итак, я заканчиваю тем, ID: 123, Цвет: Синий, Размер: 6. ID: 456, Цвет: Желтый, Размер: 8. Однако я получаю правильный идентификатор элемента, но имя_параметра / 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 [QTY] => 1 [MODEL] => 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 ) )
В принципе, вы перебираете массив $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" }
Итак, на первой итерации $option
будет 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
Это связано с тем, что ваш массив содержит ВОЗМОЖНОСТЬ существующих ключей, не гарантированных. Есть несколько разных подходов, которые вы можете предпринять, например, проверить, является ли ключ числовым (кажется, что только числовые клавиши имеют правильный набор ключей). Но так как я не знаю вашего набора данных, возможно, лучшим универсальным методом является изменение вашего кода, чтобы проверить, установлены ли ключи, прежде чем пытаться их использовать. Так..
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"; });