在Laravel、Blade或PHP中按键将每个数组child项的总量相加
Adding up the total amount of each array child item by key in Laravel, Blade or PHP
我正在尝试将每个 receiptitems->value
每个 receipt/parent 的总金额加起来。
理想的结果是循环显示收据;
receipt->id
receipt->merchant
receipt->totalValue
每个 child 值的总值(即整个收据值)。
示例 JSON 输出:
[
{
"id":1,
"user_id":1,
"image":"58a31ba406d16.jpg",
"merchant":"Tesco",
"created_at":"2016-04-23 22:02:58",
"receiptitems":[
{
"receipt_id":1,
"category_id":2,
"value":5285
},
{
"receipt_id":1,
"category_id":5,
"value":5231
},
{
"receipt_id":1,
"category_id":5,
"value":6822
}
]
},
{
"id":2,
"user_id":1,
"image":"58a31ba4073c8.jpg",
"merchant":"Tesco",
"created_at":"2016-09-19 02:55:38",
"receiptitems":[
{
"receipt_id":2,
"category_id":2,
"value":7009
},
{
"receipt_id":2,
"category_id":7,
"value":2147
}
]
},
{
"id":3,
"user_id":1,
"image":"58a31ba407a26.jpg",
"merchant":"Tesco",
"created_at":"2016-08-06 12:30:27",
"receiptitems":[
{
"receipt_id":3,
"category_id":7,
"value":4598
},
{
"receipt_id":3,
"category_id":2,
"value":8799
},
{
"receipt_id":3,
"category_id":3,
"value":773
}
]
},
{
"id":4,
"user_id":1,
"image":"58a31ba407e69.jpg",
"merchant":"Tesco",
"created_at":"2016-12-10 21:21:43",
"receiptitems":[
{
"receipt_id":4,
"category_id":5,
"value":883
},
{
"receipt_id":4,
"category_id":5,
"value":3013
},
{
"receipt_id":4,
"category_id":2,
"value":1013
},
{
"receipt_id":4,
"category_id":1,
"value":3243
}
]
},
{
"id":5,
"user_id":1,
"image":"58a31ba408187.jpg",
"merchant":"Tesco",
"created_at":"2017-01-18 14:12:16",
"receiptitems":[
{
"receipt_id":5,
"category_id":7,
"value":1355
},
{
"receipt_id":5,
"category_id":1,
"value":1547
},
{
"receipt_id":5,
"category_id":1,
"value":1640
},
{
"receipt_id":5,
"category_id":1,
"value":2466
},
{
"receipt_id":5,
"category_id":8,
"value":2689
}
]
}
]
我一直在控制器和 blade 模板中尝试,但无法获得所需的结果。我一直在看 array_sum() http://php.net/manual/en/function.array-sum.php 但我不确定如何实现它。
我在 RecriptsController 中尝试过:
$receipts = Receipt::where('user_id', Auth::id())
->with('receiptitems')
->get();
foreach ($receipts as $receipt) {
$result = array_sum($receipt->receiptitems->value);
};
return $result;
并且也在 Blade 模板中:
@foreach($receipts as $receipt)
<li>{{ $receipt->merchant }}</li>
<ul>
@foreach($receipt->receiptitems as $item)
<li>{{ array_sum($item->value) }}</li>
@endforeach
</ul>
@endforeach
一般来说,你想要array_column
in combination with array_sum
:
foreach ($receipts as $receipt) {
$total = array_sum(array_column($receipt['receiptitems'], 'value'));
print_r($total);
}
array_column
从 receiptitems
sub-array 中取出 value
键。然后 array_sum
合计。但是你有一个对象集合,所以你实际上需要一种基于 array_map
:
的稍微不同的方法
foreach ($receipts as $receipt) {
$total = array_sum(array_map(function ($o) { return $o->value; }, $receipt->receiptitems));
print_r($total);
}
顺便说一句,您可能需要考虑一个 Receipt::getTotalAttribute()
增变器,它将 return 项目总数并简化您与模型的交互方式。
虽然问题得到了回答,但我得到了我想要的结果。一位朋友帮助我选择了另一个选项(集合),该选项也有效:
public function index()
{
$receipts = Receipt::where('user_id', Auth::id())
->with('receiptitems')
->get();
$collection = collect($receipts);
$data = $collection->map(
function($receipt) {
$r = new stdClass;
$r->id = $receipt->id;
$r->merchant = $receipt->merchant;
$r->amount = collect($receipt->receiptitems)->pluck('value')->sum();
$r->date = $receipt->date;
return $r;
}
);
return view('transactions', compact('data'));
}
希望对其他人有所帮助。
我正在尝试将每个 receiptitems->value
每个 receipt/parent 的总金额加起来。
理想的结果是循环显示收据;
receipt->id
receipt->merchant
receipt->totalValue
每个 child 值的总值(即整个收据值)。
示例 JSON 输出:
[
{
"id":1,
"user_id":1,
"image":"58a31ba406d16.jpg",
"merchant":"Tesco",
"created_at":"2016-04-23 22:02:58",
"receiptitems":[
{
"receipt_id":1,
"category_id":2,
"value":5285
},
{
"receipt_id":1,
"category_id":5,
"value":5231
},
{
"receipt_id":1,
"category_id":5,
"value":6822
}
]
},
{
"id":2,
"user_id":1,
"image":"58a31ba4073c8.jpg",
"merchant":"Tesco",
"created_at":"2016-09-19 02:55:38",
"receiptitems":[
{
"receipt_id":2,
"category_id":2,
"value":7009
},
{
"receipt_id":2,
"category_id":7,
"value":2147
}
]
},
{
"id":3,
"user_id":1,
"image":"58a31ba407a26.jpg",
"merchant":"Tesco",
"created_at":"2016-08-06 12:30:27",
"receiptitems":[
{
"receipt_id":3,
"category_id":7,
"value":4598
},
{
"receipt_id":3,
"category_id":2,
"value":8799
},
{
"receipt_id":3,
"category_id":3,
"value":773
}
]
},
{
"id":4,
"user_id":1,
"image":"58a31ba407e69.jpg",
"merchant":"Tesco",
"created_at":"2016-12-10 21:21:43",
"receiptitems":[
{
"receipt_id":4,
"category_id":5,
"value":883
},
{
"receipt_id":4,
"category_id":5,
"value":3013
},
{
"receipt_id":4,
"category_id":2,
"value":1013
},
{
"receipt_id":4,
"category_id":1,
"value":3243
}
]
},
{
"id":5,
"user_id":1,
"image":"58a31ba408187.jpg",
"merchant":"Tesco",
"created_at":"2017-01-18 14:12:16",
"receiptitems":[
{
"receipt_id":5,
"category_id":7,
"value":1355
},
{
"receipt_id":5,
"category_id":1,
"value":1547
},
{
"receipt_id":5,
"category_id":1,
"value":1640
},
{
"receipt_id":5,
"category_id":1,
"value":2466
},
{
"receipt_id":5,
"category_id":8,
"value":2689
}
]
}
]
我一直在控制器和 blade 模板中尝试,但无法获得所需的结果。我一直在看 array_sum() http://php.net/manual/en/function.array-sum.php 但我不确定如何实现它。
我在 RecriptsController 中尝试过:
$receipts = Receipt::where('user_id', Auth::id())
->with('receiptitems')
->get();
foreach ($receipts as $receipt) {
$result = array_sum($receipt->receiptitems->value);
};
return $result;
并且也在 Blade 模板中:
@foreach($receipts as $receipt)
<li>{{ $receipt->merchant }}</li>
<ul>
@foreach($receipt->receiptitems as $item)
<li>{{ array_sum($item->value) }}</li>
@endforeach
</ul>
@endforeach
一般来说,你想要array_column
in combination with array_sum
:
foreach ($receipts as $receipt) {
$total = array_sum(array_column($receipt['receiptitems'], 'value'));
print_r($total);
}
array_column
从 receiptitems
sub-array 中取出 value
键。然后 array_sum
合计。但是你有一个对象集合,所以你实际上需要一种基于 array_map
:
foreach ($receipts as $receipt) {
$total = array_sum(array_map(function ($o) { return $o->value; }, $receipt->receiptitems));
print_r($total);
}
顺便说一句,您可能需要考虑一个 Receipt::getTotalAttribute()
增变器,它将 return 项目总数并简化您与模型的交互方式。
虽然问题得到了回答,但我得到了我想要的结果。一位朋友帮助我选择了另一个选项(集合),该选项也有效:
public function index()
{
$receipts = Receipt::where('user_id', Auth::id())
->with('receiptitems')
->get();
$collection = collect($receipts);
$data = $collection->map(
function($receipt) {
$r = new stdClass;
$r->id = $receipt->id;
$r->merchant = $receipt->merchant;
$r->amount = collect($receipt->receiptitems)->pluck('value')->sum();
$r->date = $receipt->date;
return $r;
}
);
return view('transactions', compact('data'));
}
希望对其他人有所帮助。