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

ショッピング カートの配列を次のように再構築します。

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 に答える
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 に答える
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 に答える