2012-08-23 58 views
0

我正在研究将项目添加到购物车的功能。如果商品已经存在于购物车中,请将其数量增加1.如果不存在,我想将商品数组添加到购物车数组中的下一个位置。这里是我的代码,我使用其中$ add_to_cart是物品ID:使用PHP添加到阵列

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添加到阵列。我该如何做这项工作?

回答

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

+0

是否有你使用'array_key_exists'而不是'isset($ item [$ add_to_cart])''的原因? –

+0

制作产品ID数组的钥匙要快得多:-) –

+1

@HighwayofLife不是真的。 isset()'有更好的性能吗? – Matt

2

你的问题是,当你添加新元素进入购物车:

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 
    ); 
} 
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