我有以下代码在按下删除按钮时从数量中删除1,如果qty = 1,则该项目将从特定索引处的数组中删除。
例如,如果数组中的第一项具有ID为“1B”且数量为“5”且名称为“item1”,则数组中的第二项具有ID为“2B”且数量为“3”且名称为按下“item2”和此项目的删除按钮,数量将更改为2(根据需要),但ID将更改为1B,名称将更改为“item1”。如果$_SESSION["Cart"]
数组中有两个以上的产品,则会发生同样的情况
我不知道我哪里出错了,但这是我的代码:
$_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
答案 0 :(得分: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
答案 1 :(得分: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;