如果数组的相同键更新值或插入为新值

时间:2015-04-09 12:57:41

标签: php arrays laravel multidimensional-array laravel-5

我正在使用laravel框架创建一个极简主义的电子商务Web应用程序,我是一个新手。

我想要实现的是当会话中存在产品时,我想在单击Add to Cart按钮时更新该产品的数量。如果会话中不存在,我想将其插入会话中。

到目前为止我尝试过的代码:

public function store( $id ) {

    $product = Product::findOrFail( $id );

    if ( \Session::has( 'cart' ) && is_array( \Session::get('cart') ) ) {
        \Session::push('cart', ['product' => (int)$id, 'quantity' => 1 ]);
    } else {
        \Session::put('cart', ['product' => (int)$id, 'quantity' => 1 ]);
    }

    \Session::flash('added_product', 'Product Added in the cart');

    return \Redirect::back();
}

上述代码的结果是:

array:3 [▼
  0 => array:2 [▼
    "product" => 1
    "quantity" => 1
  ]
  1 => array:2 [▼
    "product" => 2
    "quantity" => 1
  ]
  2 => array:2 [▼
    "product" => 1
    "quantity" => 1
  ]
]

期望的结果是:

array:2 [▼
  0 => array:2 [▼
    "product" => 1
    "quantity" => 2
  ]
  1 => array:2 [▼
    "product" => 2
    "quantity" => 1
  ]
]

请帮助我解决这个问题。感谢。

更新1

在Youssef回答之后,我得到了以下结果:

array:4 [▼
  "product" => 1
  "quantity" => 1
  0 => array:2 [▼
    "product" => 3
    "quantity" => 1
  ]
  1 => array:2 [▼
    "product" => 2
    "quantity" => 1
  ]
]

2 个答案:

答案 0 :(得分:2)

我不知道Laravel,但我认为你可以像这样处理数组:

public function store( $id ) {

    $product = Product::findOrFail( $id );

    if ( \Session::has( 'cart' ) && is_array( \Session::get('cart') ) ) {
        $cart = \Session::get('cart');
        $found = false;
        foreach($cart as $i=>$el)
        {
           if($el['product'] == $id)
           { 
             $cart[$i]['quantity']++;
             $found = true;
           }
        }
        if(!$found) {
          $cart[] = ['product' => $i, 'quantity' => 1];
        }
        \Session::put('cart', $cart);
    } else {
        \Session::put('cart', [['product' => (int)$id, 'quantity' => 1 ]]);
    }

    \Session::flash('added_product', 'Product Added in the cart');

    return \Redirect::back();
}

答案 1 :(得分:0)

如果您正在创建的会话中存在该条目,并将另一个项目推送到该数组,从而导致重复的结果。您应该将if块更改为以下内容:

$value = Session::pull( 'cart', ['product' => int($id), 'quantity' => 0 ]);
$value['quantity'] += 1;
Session::put('cart', $value);

pull方法调用将获取购物车价值(如果存在)或创建新价格(如果它不存在(数量为0))。它会增加数量,这意味着如果它已经存在则会增加1,或者如果它是您在pull调用中创建的那个则设置为1。当您致电pull时,会从会话中删除该值,以便您通过调用put将新值重新放入会话中。希望这能提供更简洁的代码。

您可以将数组安全检查添加到增量语句中:array_key_exists('quantity')