【问题标题】:Sum the value of single array based on key value根据键值对单个数组的值求和
【发布时间】:2017-08-03 19:41:00
【问题描述】:

此问题与其他问题不重复。这是不同的,这是当前代码,我正在尝试根据日期的相同键值对数组的值求和。

foreach ($TablesArr as $tr) {
     $criteria = new CDbCriteria;
     $criteria->select = 'date,mal';
     $Arr1 = $tr::model()->findAll($criteria);
     $array_1 = array();
     foreach ($Arr1 as $a1) {
          $array_1['date'] = $a1['date'];
          $array_1['mal'] = $a1['mal'];
     }
}

我当前的输出是:

Array
(
    [date] => 2015-11-00
    [mal] => 35
)
Array
(
    [date] => 2015-12-00
    [mal] => 20
)
Array
(
    [date] => 2016-01-00
    [mal] => 30
)
Array
(
    [date] => 2016-01-00
    [mal] => 10
)
Array
(
    [date] => 2015-11-00
    [mal] => 50
)

如果date 相同,则将数组中mal 的值相加。例如,在上面的数组中,日期2015-11-00 出现两次或两次以上(5 或 10 次等),然后将该日期的所有值相加。目前它出现两次,所以对于2015-11-00mal 的值将是35+50=85。我希望我的输出如下所示:

Array
(
    [date] => 2015-11-00
    [mal] => 85
)
Array
(
    [date] => 2015-12-00
    [mal] => 20
)
Array
(
    [date] => 2016-01-00
    [mal] => 40
)

我试过了:

$result = array();

        foreach($Arr1 as $data) {
            $result[ $data['date'] ] += $data['mal'];
        }

【问题讨论】:

  • @ficuscr 该问题不需要按另一列分组的总和。
  • 它不是其他问题的重复,我已经有很多时间在 SOF 上,找不到任何对我有用的价值@ficuscr
  • 已撤回。抱歉,看到很多这些,它们总是array_sum / array_map 解决方案。在上面涂上光泽。
  • 你可以使用:$result = array(); foreach($Arr1 as $data) { $result [ $Arr1 ['date'] ] += $Arr1 ['mal']; }
  • @Barmar,它也不是那个问题的重复,那个问题的答案给了我错误Illegal string offset 'date'

标签: php arrays


【解决方案1】:

您的 $array_1 变量不包含原始 $Arr1 数组中的所有值。每次循环都会覆盖相同的元素,因此它只包含来自$Arr1 的最后一项。这些行:

$array_1['date'] = $a1['date'];
$array_1['mal'] = $a1['mal'];

应该是:

$array_1[] = array('date' => $a1['date'], 'mal' => $a1['mal']);

另一个问题是您每次都通过外循环重置$array_1

您也可以使用array_merge 来组合数组,而不是循环:

$array_1 = array();
foreach ($TablesArr as $tr) {
     $criteria = new CDbCriteria;
     $criteria->select = 'date,mal';
     $Arr1 = $tr::model()->findAll($criteria);
     $array_1 = array_merge($array_1, $Arr1);
}

您可以使用php group by SUM using multi dimensional array 中的一种解决方案来创建一个关联数组,其中的总和按日期分组。你可以用另一个循环把它变成一个二维数组:

$newresult = array();
foreach ($result as $date => $mal) {
    $newresult[] = array('date' => $date, 'mal' => $mal);
}

DEMO

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多