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.
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']
}
}
}
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
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";
});