在会话中添加相同数组键的数组值

时间:2014-05-28 03:52:26

标签: php arrays session laravel

我有一个存储在Session

中的数组结构

修改item_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_quantity加起来item_id

"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);
     }

2 个答案:

答案 0 :(得分:2)

你走在正确的轨道上。请参阅代码中的注释。

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);
  }
}

答案 1 :(得分: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