0

当按下删除按钮时,我有以下代码从 qty 中删除 1 ,如果 qty=1 ,则该项目将从特定索引处的数组中删除。

例如,如果数组中的第一项的 ID 为“1B”,数量为“5”,名称为“item1”,则数组中的第二项的 ID 为“2B”,数量为“3”,名称为“item2”并按下该项目的删除按钮,数量将更改为 2(根据需要),但 id 将更改为 1B,名称更改为“item1”。$_SESSION["Cart"]如果数组中有超过 2 个产品,也会发生同样的事情。
我不确定我哪里出错了,但这是我的代码:

代码$_SESSION["Cart"]

$_SESSION["Cart"] = array(
            array(
                'name' => "namehere",
                'id' => "idHere",
                'qty' => 1,
                'price' => "pricehere"
            )
//more arrays here
        );

删除项目代码

$prodID    = $_GET["removeProd"];
foreach ($_SESSION["Cart"] as $cartItem) {
        //only continue if qty is more than one
        //remove item if 0 qty
        if ($cartItem["id"] == $prodID) {
            if ($cartItem["qty"] > 1) {
                $qty       = $cartItem["qty"] - 1; //decrease qty by one
                $cart[] = array(
                    'name' => $cartItem["name"],
                    'id' => $cartItem["id"],
                    'qty' => $qty,
                    'price' => $cartItem["price"]
                );
            } //end if
        } else {
            $cart[] = array(
                'name' => $cartItem["name"],
                'id' => $cartItem["id"],
                'qty' => $cartItem["qty"],
                'price' => $cartItem["price"]
            );
        } //end else
        $_SESSION["Cart"] = $cart;
    } //end foreach
4

2 回答 2

1

问题是您$_SESSION['Cart'] = $cart在每次迭代时都进行分配,因此它只会包含$_SESSION['Cart']数组中的最后一项。如果将它移到foreach代码末尾以下,则应该可以工作。

$cartItem您可以通过引用传递来简化这一点。这样你只修改匹配的数组元素$prodID

foreach ($_SESSION['Cart'] as $key => &$cartItem) {
  if ($cartItem['id'] == $prodID) {
    if ($cartItem['qty'] > 1) {
      $cartItem['qty'] -= 1;
    } else { 
      unset($_SESSION['Cart'][$key]); 
    }
  }
}
unset($cartItem); // break the binding
于 2013-10-23T08:12:41.113 回答
0

您的代码有一些算法/逻辑缺陷。这段代码应该做你需要它做的事情。请尝试找出它实际上做了什么,以及您的方法中的缺陷在哪里。

foreach ($_SESSION["Cart"] as $key=>$cartItem) {
    //only continue if qty is more than one
    //remove item if 0 qty
    if ($cartItem["id"] == $prodID) {
        if ($cartItem["qty"] > 1) {
            $qty = $cartItem["qty"]--;// does the same thing as x = x - 1; //decrease qty by one
            $cart[$key]['qty'] = $qty;

        } //end if
        else {
            unset($cart[$key]);
        }
        break;// ends foreach loop ( assuming there can be only one item of the same type in the cart )
    } 
} //end foreach

$_SESSION["Cart"] = $cart;
于 2013-10-23T08:00:21.727 回答