根据键值求和单个数组的值

时间:2017-08-03 19:41:00

标签: php arrays

这个问题与其他问题不重复。它是不同的,这是当前的代码,我试图基于相同的日期键值来对数组的值求和。

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'];
        }

1 个答案:

答案 0 :(得分:2)

您的$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