Проблема в том, что вы вложены на 1 уровень глубже в массивы, чем вы думаете.Чтобы прояснить это, $ _SESSION может выглядеть примерно так (непосредственно перед вводом foreach):
array(1) {
["list"] => array(3) {
["item"] => string(8) "Pineaple"
["quantity"] => int(30)
["price"] => int(15000)
}
}
(вы можете использовать методы var_dump ($ var) или print_r ($ var) для просмотра значения:http://php.net/manual/en/function.var-dump.php http://php.net/manual/en/function.print-r.php)
При выполнении итерации по $ _SESSION ["list"] цикл проходит 3 раза. На первой итерации $ key равен "item", $ value - "Pineaple".
echo $key, '. ', $item['item'], ' ', $item['quantity'], ' units', $item['price'];
"item . P P units <empty>"
Почему? Строка "item" очевидна, она просто распечатана.
$item['item']
-> 'item' приводится к (int) 0, поэтому первый символ $ item(Pineaple) печатается: P (Примеры правил преобразования string-> int приведены, например, здесь: http://www.php.net/manual/en/language.types.string.php#language.types.string.conversion)
$item['quantity']
-> то же, что и выше
$item['price']
-> поскольку цена намного превышает длину строки, выводится пустая строка: $myvar = "hi";
echo $myvar[12234]; // prints empty string
На каждой итерации вы получаете этот вывод, меняется только первое слово. В конце ставьте echo "<br />"
итерации, и вы увидите это.
Надеюсь, это вам немного поможет.