#php #arrays #list #session #foreach
#php #массивы #Список #сеанс #foreach
Вопрос:
Эти данные поступают из формы POST, идея состоит в том, чтобы просто добавлять больше строк всякий раз, когда добавляется новый продукт.
Текущий результат равен:
l. Banana 3 units: 150
Пожалуйста, взгляните на скрипт (особенно на цикл foreach):
<?php
session_start();
//Getting the list
$list= $_SESSION['list'];
//stock
$products = array(
'Pineaple' => 500, 'Banana' => 50, 'Mango' => 150,
'Milk' => 500, 'Coffe' => 1200, 'Butter' => 300,
'Bread' => 450, 'Juice' => 780, 'Peanuts' => 800,
'Yogurt' => 450, 'Beer' => 550, 'Wine' => 2500,
);
//Saving the stuff
$_SESSION['list'] = array(
'item' => ($_POST['product']),
'quantity' => ($_POST['quantity']),
'code' => ($_POST['code']),
);
//price
$price = $products[($_SESSION['list']['item'])] * $_SESSION['list']['quantity'];
$_SESSION['list']['price'] = $price;
//listing
echo "<b>SHOPPIGN LIST</b></br>";
foreach($_SESSION as $key => $item)
{
echo $key[''], '. ', $item['item'], ' ', $item['quantity'], ' units: ', $item['price'];
}
//Recycling list
$_SESSION['list'] = $list;
echo "</br> <a href='index.html'>Return to index</a> </br>";
//Printing session
var_dump($_SESSION);
?>
Комментарии:
1. сеанс сохраняется при публикации, но, похоже, вы продолжаете перезаписывать его новыми данными POST .например, в // сохранение части stuff
2. каким должен быть результат? Это сайт для вопросов, и это помогло бы сформировать ваши сообщения в краткие вопросы.
Ответ №1:
измените этот код:
//Saving the stuff
$_SESSION['list'] = array(
'item' => ($_POST['product']),
'quantity' => ($_POST['quantity']),
'code' => ($_POST['code']),
);
Для
//Saving the stuff
$_SESSION['list'][] = array(
'item' => ($_POST['product']),
'quantity' => ($_POST['quantity']),
'code' => ($_POST['code']),
);
и удалите этот код:
//Recycling list
$_SESSION['list'] = $list;
Теперь вы будете получать новую запись в $_SESSION каждый раз при публикации на странице.
Кроме того, если вы хотите, чтобы ваш вывод выглядел как:
l. Banana 3 units: 150
2. Orange 5 units: 250
etc
затем вам нужно будет изменить echo в цикле foreach() с
echo $key[''] . // everything else
чтобы просто
echo ($key 1) . // everything else
Поскольку ключом будет индекс вашего массива, начинающийся с 0, вам нужно будет выполнять 1 на каждой итерации, иначе ваш список будет выглядеть следующим образом
0. Banana 3 units: 150
1. Orange 5 units: 250
Комментарии:
1. Привет, Дэйв, отличная помощь! Массив фактически сохраняется, но теперь эхо-сигнал пропал, и появляются некоторые ошибки. Обратите внимание: Неопределенный элемент (элемент, количество) в строках 26 и 36.
Ответ №2:
Как писал iandouglas, вы каждый раз перезаписываете переменную сеанса. Следующий код также устраняет некоторые неопределенные проблемы с индексом и уже существующими продуктами.
// Test POST data.
$_POST['product'] = 'Pineaple';
$_POST['quantity'] = 1;
$_POST['code'] = 1;
//Getting the list
$_SESSION['list'] = isset($_SESSION['list']) ? $_SESSION['list'] : array();
//stock
$products = array(
'Pineaple' => 500, 'Banana' => 50, 'Mango' => 150,
'Milk' => 500, 'Coffe' => 1200, 'Butter' => 300,
'Bread' => 450, 'Juice' => 780, 'Peanuts' => 800,
'Yogurt' => 450, 'Beer' => 550, 'Wine' => 2500,
);
//Saving the stuff
$new_item = array(
'item' => $_POST['product'],
'quantity' => $_POST['quantity'],
'code' => $_POST['code'],
'price' => $products[$_POST['product']] * $_POST['quantity'],
);
$new_product = true;
foreach($_SESSION['list'] as $key => $item) {
if ($item['item'] == $new_item['item']) {
$_SESSION['list'][$key]['quantity'] = $new_item['quantity'];
$_SESSION['list'][$key]['price'] = $products[$new_item['item']] * $new_item['quantity'];
$new_product = false;
}
}
if ($new_product) {
$_SESSION['list'][] = $new_item;
}
//listing
echo "<b>SHOPPIGN LIST</b></br>";
foreach($_SESSION['list'] as $key => $item) {
echo 'key '. $key. ' '. $item['item'], ' ', $item['quantity'], ' units: ', $item['price']. '<br />';
}
Комментарии:
1. Большое спасибо! Кстати, вы знаете, как повторить предупреждение и удалить каждый $new_item, который не равен единице в массиве $ products?
2. Определите ваши допустимые продукты сверху и просто оберните все остальное внутри этого:
if (in_array($_POST['product'], $products) { // place your code here } else { echo 'Invalid product'; }
3. Это должно было быть
if (in_array($_POST['product'], array_keys($products))) {