【问题标题】:Sum collection variables汇总集合变量
【发布时间】:2020-10-25 05:41:12
【问题描述】:

我有下一个收藏:

它按zonefundo 分组,我需要总结每个fundo 包含的所有sup_ha

$transporFundo = $tansporCollect->groupBy(['zona','fundo']);
        
foreach ($transporFundo as $fundo) {
    $supFundo = $fundo->sum('sup_ha');
    dd($supFundo);
}

也就是说,例如,对于我的 zona 1 和 fundo 805 集合,我必须添加所见 364 条记录的 sup_ha 字段。

我尝试这样做,但我不知道如何访问该字段,正如我尝试过的代码所示,它返回 0。

希望你能帮帮我,谢谢

**

更新

** 好的,删除分组,例如显示如下的集合,原来有 700k 的记录

Illuminate\Support\Collection {#778646 ▼
  #items: array:4 [▼
    0 => array:3 [▼
      "zona" => 1
      "sup_ha" => 20
      "fundo" => 805
    ]
    1 => array:3 [▼
      "zona" => 1
      "sup_ha" => 10
      "fundo" => 805

    ]
    2 => array:3 [▼
      "zona" => 2
      "sup_ha" => 5
      "fundo" => 800
    ]
    3 => array:3 [▼
      "zona" => 2
      "sup_ha" => 10
      "fundo" => 900
    ]
  ]
}

所以,我需要相等 fundo 的 sup_ha 的总和,如下所示:

fundo | sum
805   | 30
800   | 5
900   | 10

我需要相等 zona 的 sup_ha 的总和,如下所示:

zona  | sum
1   | 30
2   | 15

鉴于此,这就是为什么我做了一个分组来计算fundo的总和。所以现在我不知道是否要考虑这样做是否正确

我希望你已经澄清了

【问题讨论】:

  • 根据这个question可以这样做:$supFundo = $fundo->sum(function($fun){return $fun->sum('sup_ha');});
  • 这能回答你的问题吗? Laravel sum eloquent collection
  • 第一个返回0到。第二个对我不起作用,因为他正在研究相关的收藏。我试试 supFundo = $fund->zona->fundo->sum('sup_ha');和 supFundo = $fund->fundo->sum('sup_ha');我得到一个错误,变量 zona/fundo 不在集合实例中
  • 你的集合是这样嵌套的:array(array(array('zona','destino'...)));你应该遍历所有这些。 foreach($transporFundo as $zona){foreach($zona as $fundo){$sumFundo = $fundo->sum('sup_ha');}}}
  • 我发布了一个更新来澄清问题

标签: laravel laravel-5 collections eloquent


【解决方案1】:

假设您的收藏被指定为 $collection

    $zonaArray = [];
    $fundoArray = [];
    $sum = 0;
    foreach ($collection as $key => $t) {
        if (!in_array($t['zona'], $zonaArray)) {
            $zonaArray[$key]['zona'] = $t['zona'];
            $zonaArray[$key]['sum'] = (float) $t['sup_ha'];
        } else {
            $zonaArray[$key]['sum'] = (float) $t['sup_ha'];
        }

        if (!in_array($t['fundo'], $fundoArray)) {
            $fundoArray[$key]['fundo'] = $t['fundo'];
            $fundoArray[$key]['sum'] = (float) $t['sup_ha'];
        } else {
            $fundoArray[$key]['sum'] = (float) $t['sup_ha'];
        }
    }

    $checkzona = [];
    $value = 0;
    $finalZone = [];
    $i = 0;

    foreach ($zonaArray as $key => $val) {

        if (in_array($val['zona'], $checkzona)) {
            unset($finalZone[$i - 1]);
            $val['sum'] = $value + (float) $val['sum'];
            $finalZone[$i] = $val;
            $i++;
        } else {
            $checkzona[] = $val['zona'];
            $value = $val['sum'];
            $finalZone[$i] = $val;
            $i++;
        }
    }

您的区域总和输出如下所示。

    array:2 [▼
     1 => array:2 [▼
      "zona" => 1
      "sum" => 30.0
    ]
    3 => array:2 [▼
     "zona" => 2
     "sum" => 15.0
    ]
 ]

对于基金总和:

    $checkfundo = [];
    $valuefundo = 0;
    $finalFundo = [];
    $k = 0;

    foreach ($fundoArray as $key => $fundo) {
        if (in_array($fundo['fundo'], $checkfundo)) {
            unset($finalFundo[$k - 1]);
            $fundo['sum'] = $valuefundo + (float) $fundo['sum'];
            $finalFundo[$k] = $fundo;
            $k++;
        } else {
            $checkfundo[] = $fundo['fundo'];
            $valuefundo = $fundo['sum'];
            $finalFundo[$k] = $fundo;
            $k++;
        }
    }

您的fundo wise sum 输出如下所示。

   array:3 [▼
    1 => array:2 [▼
      "fundo" => 805
      "sum" => 30.0
   ]
   2 => array:2 [▼
     "fundo" => 800
     "sum" => 5.0
   ]
   3 => array:2 [▼
      "fundo" => 900
     "sum" => 10.0
   ]
 ]

我希望它对你有用。

【讨论】:

    【解决方案2】:

    假设您的收藏已分配给$collection

    所以,我需要等于fundosup_ha 的总和。

    • 高阶函数
    return $collection->groupBy('fundo')->map->sum('sup_ha');
    
    • 另类
    return $collection
        ->groupBy('fundo')
        ->transform(function (Collection $sub) {
            return $sub->sum('sup_ha');
        });
    
    • 打印出来
    {
        "805": 30,
        "800": 5,
        "900": 10
    }
    

    我需要等于zonasup_ha 的总和

    • 高阶函数
    return $collection->groupBy('zona')->map->sum('sup_ha');
    
    • 另类
    return $collection
        ->groupBy('zona')
        ->transform(function (Collection $sub) {
            return $sub->sum('sup_ha');
        });
    

    打印出来

    {
        "1": 30,
        "2": 15
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-14
      • 2017-06-28
      相关资源
      最近更新 更多