使用 PHP 添加到数组

问题描述 投票:0回答:3

我正在开发一个将商品添加到购物车的功能。如果购物车中已存在该商品,请将其数量增加 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 附加为倒数第二个元素,然后将数量值附加为最后一个元素。我怎样才能做到这一点?

php arrays multidimensional-array
3个回答
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
    );
}

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
投票

正如@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
© www.soinside.com 2019 - 2024. All rights reserved.