Laravel 对对象的所有属性应用reduce方法

Laravel 对对象的所有属性应用reduce方法,laravel,collections,reduce,Laravel,Collections,Reduce,我在Laravel有一个表示月度报告的对象 0 => array:20 [▼ "id" => 43 "operation_id" => 1 "meter_id" => 3 "period" => "monthly" "total_conso" => "103.42"

我在Laravel有一个表示月度报告的对象

  0 => array:20 [▼
    "id" => 43
    "operation_id" => 1
    "meter_id" => 3
    "period" => "monthly"      
    "total_conso" => "103.42"
    "total_autoconso" => "59.47"
    "total_grid" => "43.95"
    "bill" => "31.95"
    "grid_fee" => "26.97"
    "solar_turpe_tax_fee" => "4.99"
    "savings" => "4.41"
    "total_prod" => null
    "total_surplus" => null
    "autoconso_rate" => "57.5"
    "autoprod_rate" => null
    "surplus_rate" => null
    "date" => "2019-08-24T00:00:00.000000Z"
    "created_at" => "2019-08-24T00:00:00.000000Z"
    "updated_at" => "2020-10-01T15:03:38.000000Z"
我有一个包含12个对象的数组,每个月一个

我正在计算年度报告值,我必须对每个字段的所有12个月进行求和

我可以用reduce一个字段一个字段地使用:

$totalConso = $reports->reduce(function ($sum, $report) {
            return $sum + $report->total_conso;
        }, 0);
我所寻找的是一种在所有领域都能做到这一点的方法。可能吗?它将允许我不重复10倍相同的减少功能

谢谢

使用helper和sum方法:

使用辅助对象和求和方法:


你可以这样做:

[$totalConso,$totalAutoConso]=收集['total_conso','total_autoconso']->mapfn$property=>$reports->sum$property; 如果希望数组中包含每个总数,请执行以下操作:

$totals=collect['total_conso','total_autoconso']->mapWithKeysfn$property=>[$property=>$reports->sum$property]; 这将为您提供一个包含所有总数的集合

如果不喜欢硬编码total_*属性列表,可以从模型的可填充属性列表中动态获取它们。假设使用可填充属性:

$totals=collectReport::make->Filable ->filterfn$property=>strpos$property,“总计”==0 ->mapWithKeysfn$property=>[$property=>$reports->sum$property];
演示:

您可以这样做:

[$totalConso,$totalAutoConso]=收集['total_conso','total_autoconso']->mapfn$property=>$reports->sum$property; 如果希望数组中包含每个总数,请执行以下操作:

$totals=collect['total_conso','total_autoconso']->mapWithKeysfn$property=>[$property=>$reports->sum$property]; 这将为您提供一个包含所有总数的集合

如果不喜欢硬编码total_*属性列表,可以从模型的可填充属性列表中动态获取它们。假设使用可填充属性:

$totals=collectReport::make->Filable ->filterfn$property=>strpos$property,“总计”==0 ->mapWithKeysfn$property=>[$property=>$reports->sum$property];
演示:

您可以通过一个简单的foreach循环手动完成此操作;我可以做到,但我讨厌循环XD。如果没有更好的选择,我会这样做,但有时这些实际上是性能的提升,这里是12比1,而且非常简单。您仍然可以使用array\u map或array\u walk,但它们将执行相同的循环。您可以通过简单的foreach循环手动执行此操作;我可以做到,但我讨厌循环XD。如果没有更好的选择,我会这样做,但有时这些实际上是性能的提升,这里是12比1,而且非常简单。您仍然可以使用array\u map或array\u walk,但它们将执行相同的循环。哦,这比使用reduce函数要好。但问题依然存在。如何将sum应用于object中的所有字段无需收集,它已经是一个报告集合。噢,这比使用reduce函数要好。但问题依然存在。如何将sum应用于object中的所有字段无需收集,它已经是一个报告集合。
$total = collect($reports)->sum('total_conso');