0

次のようにショッピングカートに追加しています。

function addItem($id, $qty="1"){
    if (($this->isInCart($id))  == false){ 
        $this->cart[] = array( 'id' => $id, 'qty' => $qty);
    } else{
        $this->cart[$id]['qty']++;
    }
}

アイテムが既にカートに入っている場合、メソッドに現在の $id を 1 ずつ増やすように指示するだけですが、これらの呼び出しでは機能しないようです。

$basket->addItem('monkey','200');
$basket->addItem('dog', '10');
$basket->addItem('dog');

犬のアイテムを 2 回目に追加すると、次の関数はバスケットに 10 匹の犬しか報告しません。

function numberOfProduct($id){
    unset($number);
    foreach($this->cart as $n ){
        if ($n['id'] == $id){           
            $number = $number + $n['qty'];
        }
    }
    return $number;
}

addToBasket メソッドで配列をインクリメントすることに問題があると確信していますが、手続き型コーディングでまったく同じメソッドを使用すると、問題なく動作します。

私は本当に立ち往生しています。

編集:リクエストされたカートメソッドにあります

function isInCart($id){
    $inCart=false;
    $itemsInCart=count($this->cart);
    if ($itemsInCart > 0){
        foreach($this->cart as $cart){
            if ($cart['id']==$id){
                return $inCart=true;
                break;
            }
        }
    }   
    return $inCart;
}
4

2 に答える 2

3

配列に追加するときは、ID 値ではなく数値キーを使用しています。

$this->cart[] = array( 'id' => $id, 'qty' => $qty);

次のように変更します。

$this->cart[$id] = array( 'id' => $id, 'qty' => $qty);

この変更をメソッドに組み込むisInCart()と、うまくいくはずです。

于 2013-02-25T17:41:07.403 に答える
0
function addItem($id, $qty="1"){
...
    $this->cart[$id]['qty']++;
...

関数の2番目のパラメーターを文字列に設定します。関数を呼び出したときにも、文字列を渡しました。

$basket->addItem('monkey','200');
$basket->addItem('dog', '10');
$basket->addItem('dog');

文字列が$string = "123"あり、それをでインクリメントしようとすると$string++、その数値はインクリメントされません。数字から引用符を削除すると、期待どおりに機能するはずです

function addItem($id, $qty=1){
if (($this->isInCart($id))  == false){ 
    $this->cart[] = array( 'id' => $id, 'qty' => $qty);
} else{
    $this->cart[$id]['qty']++;
}
}

そして、次のような関数を呼び出します

$basket->addItem('monkey',200);
$basket->addItem('dog', 10);
$basket->addItem('dog');

番号が必要な場合は、番号だけを使用するのが最善です。$qty文字列を使用するのはユーザー入力からのものである場合は理解できますが、その場合は、文字列$qty = intval($qty)の数値バージョンを取得するために使用する必要があります。

于 2013-02-25T18:12:15.313 に答える