0

我正在研究将商品添加到购物车的功能。如果购物车中已经存在该商品,则将其数量增加 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 添加到数组中。我怎样才能使这项工作?

4

3 回答 3

2

您的问题是当您向购物车添加新元素时:

if (!$added){
    $cart[count($cart)]['id'] = $add_to_cart;
    $cart[count($cart)]['qty'] = 1;
}

你在每一行都打电话count($cart)。第1行调用后,计数不同,所以第2行添加了不同的元素。你想要的是将一个数组推到数组上。尝试这个:

if (!$added){
    $cart[] = array(
        'id' => $add_to_cart,
        'qty' => 1
    );
}
于 2012-08-23T20:22:42.630 回答
2

将您的购物车数组重组为如下所示:

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 行。

于 2012-08-23T20:21:55.190 回答
0

正如@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
于 2012-08-23T20:32:44.880 回答