试图找出如何从购物车中删除项目在PHP



我正在尝试制作一个电子商务网站,我不太清楚如何让购物车发挥作用。我可以在购买前向购物车添加金额,但我希望它在数量设置为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
}

最新更新