2012-08-23 78 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