我有一个简单的购物车数组,如果用户再次选择同一产品,我想要更新。如果他们的购物车中已经有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
上,该值未发生变化?
我不明白为什么。
答案 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
[...]
}