0

我正在构建的购物车似乎只更新了数组第一个元素的数量。因此,例如,我购物车中的第一个项目的数量为 1,然后当我从产品页面添加另一个数量 2 时,总数变为 3,这就是我想要的。但是,如果我对另一个项目重复这些步骤,它将分别将它们添加到数组中,而不是将它们组合在一起

if(isset($_GET['add'])){
foreach ($_SESSION['cart'] as $key => $item){
            if ($item['id'] == $itemID) {

                $newQuan = $item['quantity'] + $quantity;

                unset($_SESSION['cart'][$key]);

                $_SESSION['cart'][] = array("id" => $itemID,"quantity" => $newQuan);
                header('Location:xxx');//stops user contsanlty adding on refresh
                exit;
            }
            else{
                $_SESSION['cart'][] = array("id" => $itemID,"quantity" => $quantity);
                header('xxx');//stops user contsanlty adding on refresh
                exit;
            }
        }
    }

谁能帮我解释一下为什么只更新第一个元素?

4

3 回答 3

0

首先,问题和代码似乎还不够清楚,但我会尽力提供我认为可能有帮助的建议(我会做出一些假设)。

这些变量从何而来?

$itemID, $quantity

假设他们来了$_GET,我会说最好保存您的购物车信息,如下所示:

$itemCartIndex = strval($itemID);
//convert the integer item id to a string value -- or leave as string if already a string
$currentQuantity = (isset($_SESSION["cart"][$itemCartIndex]))? intval($_SESSION["cart"][$itemCartIndex]["quantity"]):0;
//set it by default if the index does not exist in the cart already
$currentQuantity += $quantity;
//update the quantity for this particular item
$_SESSION["cart"][$itemCartIndex] = array("quantity"=>$currentQuantity,...,"price"=>12.56);
//set up the index for this item -- this makes it easy to remove an item from the cart
//as easy as unset($_SESSION["cart"][$itemCartIndex]

完成后,向所有者展示/展示购物车是微不足道的。

祝你好运

于 2012-05-31T11:06:50.200 回答
0

我还没有测试过,但这可能会更简单一些:

if(isset($_GET['add']))
{
    if(!isset($_SESSION['cart'])) $_SESSION['cart'] = array();
    if(!isset($_SESSION['cart'][$itemID]))
    {
        $_SESSION['cart'][] = array('id' => $itemID, 'quantity' => $quantity);
    }
    else
    {
        $_SESSION['cart'][$itemID]['quantity'] += $quantity;
    }
}
于 2012-05-31T10:44:42.450 回答
0

您的问题是 foreach 循环中的 else-case 。第一个项目由 if 检查,然后 - 当第一个项目不匹配时 - else 案例激活并添加新项目。

else{
            $_SESSION['cart'][] = array("id" => $itemID,"quantity" => $quantity);
            header('xxx');//stops user contsanlty adding on refresh
            exit;
        }

您想要做的是检查整个购物车,然后 - 如果未找到该文章 - 将其添加到购物车。为此,我建议使用一个变量来检查您是否在循环内找到了条目。为了获得灵感,我在下面插入了代码。只需要进行细微的更改:添加 found-variable 并将其初始化(未找到),在 if-case 中将变量设置为 found 并检查退出 foreach-loop 后是否设置了变量(如果不是,您确定要将商品添加到购物车)。

$foundMyArticle = 0;

foreach ($_SESSION['cart'] as $key => $item){
        if ($item['id'] == $itemID) {
            $foundMyArticle = 1;
            ... THE OTHER CODE
} //end of the foreach

if($foundMyArticle == 0)
{ //COPY THE CODE FROM THE ELSE-CASE HERE }
于 2012-05-31T10:40:38.437 回答