我有一个存储在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);
}
答案 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
)
)