1

単純なカート配列があり、ユーザーが同じ製品を再度選択した場合に更新したいと思います。カートにすでに5本の鉛筆があり、カートにさらに4本の鉛筆を追加する場合は、5本と4本の鉛筆の2つのエントリではなく、9本の鉛筆をカートに入れてください。

私が持っているコード:

$sub = array("id" => $_POST['pID'], "name" => $_POST['pName'], "price" => $_POST['pPrice'], "quantity" => (int) $_POST['pQuant']);
$updated = false;
foreach($cart as $c)
{
    if($c['id']==$_POST['pID']) {
        var_dump($c); 
        echo "<br>";

        $c['quantity'] += (int) $_POST['pQuant'];
        var_dump($c); 
        echo "<br>";
        var_dump($cart); 
        echo "<br>";
        $updated = true;
    }

}

if(!$updated) {$cart[] = $sub;}

いくつかの愚かな理由で(私がここで見逃しているのは本当に明白なことだと確信しています)、var_dump$cの最初のものは問題ありません。それが元の値です。次に、2番目var_dumpのに番号が追加されます。しかし、の3番目var_dumpに、$cart値は変更されていませんか?

理由がわかりません。

4

3 に答える 3

5

foreach変数内に$cはバスケットアイテムのコピーのみが含まれているため、コピーを更新しますが、内の元のアイテムは更新しません$cart$cこれは、代わりに次の参照を使用することで回避できます。

foreach($cart as &$c)

&の前に注意してください$c

于 2013-01-26T22:11:50.320 に答える
1

foreach元の配列のコピーを作成します。元の配列を操作するには、次を使用します。

foreach(array_keys($cart) as $k) {
    $c = &$cart[$k];
    // rest of code
}
于 2013-01-26T22:11:08.513 に答える
1

問題は、foreachが参照を使用しないことです。値を使用します。変更したい$cart場合は、2つの方法があります。

foreach($cart as $key => $c) {
    $cart[$key]['quantity'] = += (int) $_POST['pQuant'];
}

代替案:

foreach($cart as &$c) {// use a reference
[...]    
}
于 2013-01-26T22:12:31.927 に答える