我正在开发一个将商品添加到购物车的功能。如果购物车中已存在该商品,请将其数量增加 1。如果不存在,我想将商品数组添加到购物车数组的下一个位置。这是我正在使用的代码,其中 $add_to_cart 是商品 ID:
if ($add_to_cart) {
$added = false;
foreach ($cart as &$item){
if ($item['id'] == $add_to_cart){
$item['qty'] += 1;
$added = true;
}
}
if (!$added) {
$cart[count($cart)]['id'] = $add_to_cart;
$cart[count($cart)]['qty'] = 1;
}
$_SESSION[$session_id]['cart'] = $cart;
}
当我使用此代码时,它将项目的 ID 附加为倒数第二个元素,然后将数量值附加为最后一个元素。我怎样才能做到这一点?
您的问题是当您向购物车添加新元素时:
if (!$added){
$cart[count($cart)]['id'] = $add_to_cart;
$cart[count($cart)]['qty'] = 1;
}
您在每一行中呼叫
count($cart)
。 调用第一行后,计数不同,因此第二行添加了不同的元素。 你想要的是将一个数组推到数组上。 试试这个:
if (!$added){
$cart[] = array(
'id' => $add_to_cart,
'qty' => 1
);
}
将您的购物车数组重组为如下所示:
array(
'id' => 'qty',
.
.
.
);
我的意思是你不必像你那样循环遍历数组。
您可以检查
key
处的索引是否已设置,然后增加该索引处的值。
if (isset($item[$add_to_cart])) { // formerly if(array_key_exists($add_to_cart, $item)) {
$item[$add_to_cart]++;
} else {
$item[$add_to_cart] = 1;
}
通过这样做,你的性能将从 O(n) 变为 O(1),并且代码行数从 11 行变为 5 行。
正如@Matt所说,您可能会重组您的购物车数组。但如果您确实想使用当前的购物车结构:
$cart = array();
function add_item($cart, $item_id)
{
if(is_array($cart))
{
$added = false;
for($i=0; $i<count($cart); $i++)
{
if($cart[$i]['id'] == $item_id)
{
$cart[$i]['qty'] ++;
$added = true;
break;
}
}
if($added == false)
{
$i = count($cart);
$cart[$i]['id'] = $item_id;
$cart[$i]['qty'] = 1;
}
}
return $cart;
}
$cart = add_item($cart, 50);
$cart = add_item($cart, 50);
$cart = add_item($cart, 50);
$cart = add_item($cart, 25);
$cart = add_item($cart, 25);
$cart = add_item($cart, 10);
var_dump($cart);
它打印:
array
0 =>
array
'id' => int 50
'qty' => int 3
1 =>
array
'id' => int 25
'qty' => int 2
2 =>
array
'id' => int 10
'qty' => int 1
编辑:具有更好的结构
$cart = array();
function add_item($cart, $item_id)
{
if(is_array($cart))
{
if(array_key_exists($item_id, $cart))
{
$cart[$item_id]++;
}
else
{
$cart[$item_id] = 1;
}
}
return $cart;
}
$cart = add_item($cart, 50);
$cart = add_item($cart, 50);
$cart = add_item($cart, 50);
$cart = add_item($cart, 25);
$cart = add_item($cart, 25);
$cart = add_item($cart, 10);
var_dump($cart);
它打印:
array
50 => int 3
25 => int 2
10 => int 1