我正在尝试制作一个电子商务网站,我不太清楚如何让购物车发挥作用。我可以在购买前向购物车添加金额,但我希望它在数量设置为0时从购物车中删除商品。
if (isset($_POST['update'])) {
for ($i = 0; $i < sizeof($_SESSION['quantity']); $i++) {
$postID = 'qty' . $i;
$_SESSION['quantity'][$i] = $_POST[$postID];
if ($_SESSION['quantity'][$i] == 0) {
unset($_SESSION['shoppingcart'][$i]);
unset($_SESSION['quantity'][$i]);
unset($_SESSION['name'][$i]);
unset($_SESSION['price'][$i]);
}
}
}
下面是cart变量,它创建了一个包含所有添加产品的表
<form method="post">
<?php
if (!empty($_SESSION['shoppingcart'])) {
for ($i = 0; $i < sizeof($_SESSION['shoppingcart']); $i++) {
$cart .= '<tr>';
$cart .= '<td>' . $_SESSION['name'][$i] . '</td>';
$cart .= '<td><input type="text" id="quantity"name="qty' . $i . '"value="' . $_SESSION['quantity'][$i] . '" onkeyup="checkInput()"></td>';
$cart .= '<td>$' . $_SESSION['price'][$i] . '</td';
$cart .= '<td>$' . $_SESSION['quantity'][$i] * $_SESSION['price'][$i] . '</td>';
$cart .= '</tr>';
$total += ($_SESSION['quantity'][$i] * $_SESSION['price'][$i]);
$totalDiscounted += ($_SESSION['quantity'][$i] * $_SESSION['price'][$i]) / 100 * 30;
}
</form>
当我删除数组中最后一块的东西时,它会工作,以该顺序删除数组中第一个添加的东西,但是当我试图先删除第一个元素或任何无序的东西时,它会给我一个错误。">:未定义数组键0"。我做错了什么?
未定义索引来自unset()
的使用。调用unset()后,数组的索引不会被重新排序。
为例:
$array = [1, 2, 3];
unset($array[1]);
print_r($array); // indexes : 0 and 2.
你可以:
-
使用
array_values()
重新索引数组unset($_SESSION['shoppingcart'][$i]); $_SESSION['shoppingcart'] = array_values($_SESSION['shoppingcart']);
-
或者,检查循环中数据的存在:
for ($i = 0; $i < sizeof($_SESSION['shoppingcart']); $i++) { if (!isset($_SESSION['name'][$i])) { continue; } $cart .= '<tr>'; //... }
另一种方法是对顺序使用数据结构:
// add
$_SESSION['shoppingcart'][] = [
'quantity' => 1,
'name' => 'item',
'price' => 1.00,
];
// to update an index
$_SESSION['shoppingcart'][$index]['quantity'] = 2;
// to remove an index
unset($_SESSION['shoppingcart'][$index]);
然后,使用foreach()
列出
foreach ($_SESSION['shoppingcart'] => $data) {
// display item
}