Take the 2-minute tour ×
Stack Overflow is a question and answer site for professional and enthusiast programmers. It's 100% free, no registration required.

I have the following array structure in place that i have to keep as it's an existing website:

$label_options = array(
    "label_size" => 'A4',
    "label_position" => 'Top',
    "label_qty" => 50
);

$ink_options = array(
    "black" => 1,
    "colour" => 0
);

$item = array(
    "item_number" => 12546518,
    "item_type" => 'Canon',
    "item_label_options" => $label_options,   
    "item_ink_options" => $ink_options,
    "item_qty" => 2,      
    "item_price" => 13.99,
    "item_total" => 26.98,
    "item_delivery" => 2.49
);

if (isset($_SESSION['cart'])) {
    $_SESSION['cart'][$unique] = $item;
} else {
    $_SESSION['cart'] = array($unique => $item);
}

I now want to be able to output the values inside the arrays and the arrays inside the array. I can use the below:

foreach ($_SESSION['cart'] as $unique => $item) {
    print 'Item Number = '.$item['item_number'].'<br />';
    print 'Qty = '.$item['item_qty'].'<br />';
    print 'Price = '.$item['item_price'].'<br />';

    foreach ($item['item_label_options'] as $key => $option) {
       print $option['label_size'].'<br />';
       print $option['label_position'].'<br />';
       print $option['label_qty'].'<br />';
    }
}

which successfully outputs the first loop but not the second - just putting the first letter of each:

Item Number = 12546518
Qty = 1
Price = 7.99

A // should be A4
T // should be Top
5 // should be 50

Also is there a way i can loop and output all the values without having to actually write 'Item Number = ... it can just output each key with its value as i won't always know how many and what the names of each one are?

share|improve this question
    
@jszobody that has nothing to do with his issue. –  Dave Dec 5 '13 at 15:44

3 Answers 3

up vote 2 down vote accepted

In your inner foreach loop, the keys label_size, label_position and label_qty don't exist. When a key doesn't exist, I guess it's defaulting to 0 and as a result just gives you the first letter. This will produce what you want:

foreach ($_SESSION['cart'] as $unique => $item) {
    print 'Item Number = '.$item['item_number'].'<br />';
    print 'Qty = '.$item['item_qty'].'<br />';
    print 'Price = '.$item['item_price'].'<br />';
    foreach ($item['item_label_options'] as $key => $option) {
       print $option.'<br />';
    }
}
share|improve this answer

why not print just $key and $value, this should print what you want: http://jp1.php.net/manual/de/control-structures.foreach.php

share|improve this answer

You are incorrectly accessing the $label_options array within $_SESSION['cart']. Within...

foreach ($item['item_label_options'] as $key => $option) {
   print $option['label_size'].'<br />';
   print $option['label_position'].'<br />';
   print $option['label_qty'].'<br />';
}

...$option is the array value, and not an array itself. You can easily verify this by echoing $key and $option. When you try and print $option['label_qty'] PHP essentially treats the string like an array, giving you the first letter.

You can access the items by key using:

foreach ($_SESSION['cart'] as $unique => $item) {
    echo 'Item Number = '.$item['item_number'].'<br />';
    echo 'Qty = '.$item['item_qty'].'<br />';
    echo 'Price = '.$item['item_price'].'<br />';
    echo $item['item_label_options']['label_size'];
    echo $item['item_label_options']['label_position'];
    echo $item['item_label_options']['label_qty'];
}
share|improve this answer
    
Thanks for your answer Dave, is there any way i can loop through all the item_label_options as i won't always know how many and what each one is called? –  odd_duck Dec 5 '13 at 15:55
    
@odd_duck My answer does what you need. You just needed echo the value of $option itself. –  Sinomai Dec 5 '13 at 16:01

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.