数组不保存计算?

时间:2013-01-26 22:08:14

标签: php arrays

我有一个简单的购物车数组,如果用户再次选择同一产品,我想要更新。如果他们的购物车中已经有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;}

出于某些愚蠢的原因,(我确定这是一个非常明显的事情,我在这里失踪),$ c的第一个var_dump是好的。这是原始价值观。然后第二个var_dump,将数字添加到其上。但是,在var_dump的{​​{1}}的第三个$cart上,该值未发生变化?

我不明白为什么。

3 个答案:

答案 0 :(得分:5)

foreach内,变量$c只是购物篮商品的副本,因此您需要更新副本,而不是$cart中的原始商品。这可以通过使用$c的引用来避免:

foreach($cart as &$c)

请注意&前面的$c

答案 1 :(得分:1)

foreach创建原始数组的副本。要使用原始数组,请使用:

foreach(array_keys($cart) as $k) {
    $c = &$cart[$k];
    // rest of code
}

答案 2 :(得分:1)

问题是,foreach不使用引用。它使用价值观。如果您想更改$cart,您有两种方法:

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

替代方案:

foreach($cart as &$c) {// use a reference
[...]    
}