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

私はそれをテストしていませんが、これはもう少し簡単かもしれません:

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 に答える
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 に答える