1

我有一个简单的购物车数组,如果用户再次选择相同的产品,我想更新它。如果他们的购物车中已经有 5 支铅笔,并且他们又向购物车中添加了 4 支铅笔,我希望他们的购物车中有 9 支铅笔,而不是 5 支和 4 支铅笔的两个条目。

我有这个代码:

$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 很好。那是原始值。然后第二个var_dump,将数字添加到它上面。但是在第三个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你有两种方法:

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

替代方案:

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