【问题标题】:Add array values of same array keys in session在会话中添加相同数组键的数组值
【发布时间】:2014-07-17 03:22:47
【问题描述】:

我有一个存储在 Session 中的数组结构

edititem_id 的数量不确定。一笔交易可能有 1-3 件商品,下一笔交易可能有 2-20 件商品。

"items": [{
    "item_id": "1",
    "item_quantity": "151"
}, {
    "item_id": "2",
    "item_quantity": "54"
}, {
    "item_id": "2",
    "item_quantity": "23"
}, {
    "item_id": "3",
    "item_quantity": "3"
}, {
    "item_id": "3",
    "item_quantity": "3"
}]

我想要实现的是将所有具有相同item_iditem_quantity 加起来

"items": [{
    "item_id": "1",
    "item_quantity": "151"
}, {
    "item_id": "2",
    "item_quantity": "77"
}, {
    "item_id": "3",
    "item_quantity": "6"
}]

这是我迄今为止尝试过的,但我没有得到想要的结果

控制器

public function Save() {
    if (Input::has('addItem')) {
        if (Session::has('items')) {
            Session::push('items', [
                'item_id' => Input::get('item_id'),
                'item_quantity' => Input::get('item_quantity')
            ]);
            $array = Session::get('items');

            foreach($array as $key => $value) {
                foreach($value as $item_id => $item_quantity) {
                    $total = array();

                    $id = $value['item_id'];

                    $quantity = $value['item_quantity'];

                    if (!isset($total[$id])) {
                        $total[$id] = 0;
                    }

                    $total[$id] += $quantity;
                    echo $total[$id];

                }
            } else {
                Session::put('items', [
                    0 => [
                        'item_id' => Input::get('item_id'),
                        'item_quantity' => Input::get('item_quantity')
                    ]
                ]);
            }

            $data = Session::all();

            //return $data;

            $item = Item::lists('item_name', 'id');
            return View::make('test')->with('data', $data)->with('items', $item);
     }

【问题讨论】:

    标签: php arrays session laravel


    【解决方案1】:

    您可以选择创建一个新数组,然后将旧数组中的值相加。你可以做这样的事情。考虑这个例子:

    // dummy data
    $raw = '{"items": [{ "item_id": "1", "item_quantity": "151"}, { "item_id": "2", "item_quantity": "54"}, { "item_id": "2", "item_quantity": "23"}, { "item_id": "3", "item_quantity": "3"}, { "item_id": "3", "item_quantity": "3"}]}';
    $values = json_decode($raw); // for sample data's sake
    $values = reset($values); // get first level 'items'
    
    $new_values = array();
    foreach($values as $key => $value) {
        if(!isset($new_values[$value->item_id])) $new_values[$value->item_id] = new stdClass(); // initialize new object
        if(!isset($new_values[$value->item_id]->item_quantity)) $new_values[$value->item_id]->item_quantity = 0; // initialize default value
        $new_values[$value->item_id]->item_id = $value->item_id; // append new item id
        $new_values[$value->item_id]->item_quantity += $value->item_quantity; // sum values
    }
    
    echo '<pre>';
    print_r($new_values);
    echo '</pre>';
    

    样本输出:

    Array
    (
        [1] => stdClass Object
            (
                [item_quantity] => 151
                [item_id] => 1
            )
    
        [2] => stdClass Object
            (
                [item_quantity] => 77
                [item_id] => 2
            )
    
        [3] => stdClass Object
            (
                [item_quantity] => 6
                [item_id] => 3
            )
    
    )
    

    Sample Fiddle

    【讨论】:

    • 但这需要我手动创建并插入值数组。但由于 item_id 的数量是动态的,我无法确定它可以有多大。
    • @lozadaOmr 你指的是什么?样本值?这只是一个参考,$values 可能代表$array = Session::get('items');
    • 我设置了$values = Session::get('items');,它返回了错误Trying to get property of non-object。上线if(!isset($new_values[$value-&gt;item_id])) $new_values[$value-&gt;item_id] = new stdClass();
    • @lozadaOmr 对不起,我忘了你有items 索引,在$values = Session::get('items'); 之后添加$values = reset($values);,检查编辑
    【解决方案2】:

    你在正确的轨道上。见代码中的 cmets。

    public function Save() {
      if (Input::has('addItem')) {
        if (Session::has('items')) {
          Session::push('items', [
              'item_id' => Input::get('item_id'),
              'item_quantity' => Input::get('item_quantity')
          ]);
          $array = Session::get('items');
          $total = array(); //move outside foreach loop because we don't want to reset it
    
          foreach ($array as $key => $value) {
    
              $id = $value['item_id'];
              $quantity = $value['item_quantity'];
    
              if (!isset($total[$id])) {
                $total[$id] = 0;
              }
    
              $total[$id] += $quantity;
              echo $total[$id];
          }
    
          //now convert our associative array from  array(actual_item_id => actual_item_quantity,....)
          //into array(array('item_id' => actual_item_id, 'item_quantity' => actual_item_quantity), ....)
          $items = array();
    
          foreach($total as $item_id => $item_quantity) {
            $items[] = array(
                'item_id' => $item_id,
                'item_quantity' => $item_quantity
            );
          }
    
          Session::put('items', $items);
        } else {
          Session::put('items', [
              0 => [
                  'item_id' => Input::get('item_id'),
                  'item_quantity' => Input::get('item_quantity')
              ]
          ]);
        }
    
        $data = Session::all();
    
        //return $data;
    
        $item = Item::lists('item_name', 'id');
        return View::make('test')->with('data', $data)->with('items', $item);
      }
    }
    

    【讨论】:

    • 我试用了您的代码,工作正常,它将所有 item_quantity 添加到相同的 item_iditem_quantity 结束是预期值的两倍。
    • @lozadaOmr 你能再试一次吗?我删除了其中一个 foreaches
    • 尝试使用类实例而不是外观。就像 Session::has('items') 到 $request->session()->has('items') Session::get('items') 到 $request->session()->get('items ')
    猜你喜欢
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多