按日期列对多个多维数组中的行数据进行分组,并对每组中的另一列求和

问题描述 投票:0回答:4

我需要通过共享日期列对 3 个多维数组中的数据进行合并和分组。在这些组中,我想对单位列值求和,以便拥有一个二维数组,其中的行包含唯一日期和总单位。

$array1 = [
    [
        "sales" => [
            ["Date" => "2014-04-01", "Units" => 1],
            ["Date" => "2014-04-02", "Units" => 7]
        ]
    ]
];

$array2 = [
    [
        "sales" => [
            ["Date" => "2014-04-01", "Units" => 3],
            ["Date" => "2014-04-02", "Units" => 2]
        ]
    ]
];

$array3 = [
    [
        "sales" => [
            ["Date" => "2014-04-01", "Units" => 0],
            ["Date" => "2014-04-02", "Units" => 5]
        ]
    ]
];

期望的输出::

[
    ['Date' => '2014-04-01', 'Units' => 4],
    ['Date' => '2014-04-02', 'Units' => 14],
]
php arrays merge sum grouping
4个回答
1
投票
<?php
$array1 = array("orange", "banana");
$array2 = array("ab", "ba");
$array3 = array("cd", "ef");
array_push($array1,$array2 , $array3);
print_r($array1);
?>

0
投票
<?php

$arr1=array(
'Date' => '2014-04-02'
 'Units' => 5
    );
$arr2=array(
'Date' => '2014-04-02'
 'Units' => 5
    );
$arr3=array(
'Date' => '2014-04-02'
 'Units' => 5
    );

$arr['sales'][0]=$arr1;
  $arr['sales'][1]=$arr2;
  $arr['sales'][2]=$arr3;
$data[]=$arr;

print_r($data);
?>

0
投票

假设您有您提到的数组,则执行此操作的方法如下:

<?php 

$first =  array ();
$first[0] =  array ( "Date" => "2014-04-01",  "Units" => 1 );
$first[1] =  array ( "Date" => "2014-04-02",  "Units" => 7 );
$first[2] =  array ( "Date" => "2014-04-03",  "Units" => 5 );
$first[3] =  array ( "Date" => "2014-04-04",  "Units" => 1 );



echo "<pre>";
print_r ($first);
echo "</pre>";
echo "<hr>";

$second =  array ();
$second[0] =  array ( "Date" => "2014-04-01",  "Units" => 3 );
$second[1] =  array ( "Date" => "2014-04-02",  "Units" => 2 );
$second[2] =  array ( "Date" => "2014-04-03",  "Units" => 5 );
$second[3] =  array ( "Date" => "2014-04-04",  "Units" => 2 );

echo "<pre>";
print_r ($second);
echo "</pre>";
echo "<hr>";

$third =  array ();
$third[0] =  array ( "Date" => "2014-04-01",  "Units" => 0 );
$third[1] =  array ( "Date" => "2014-04-02",  "Units" => 5 );
$third[2] =  array ( "Date" => "2014-04-03",  "Units" => 5 );
$third[3] =  array ( "Date" => "2014-04-04",  "Units" => 4 );

echo "<pre>";
print_r ($third);
echo "</pre>";
echo "<hr>The total is: ";



$total = array();

foreach ($first as $key=>$day) {
    $total[$key]=array("Date" => "2014-04-02",  "Units" => ($first[$key]["Units"]  +$second[$key]["Units"]  +$third[$key]["Units"]) );

}

echo "<pre>";
print_r ($total);
echo "</pre>";
echo "<hr>";

但这仅在每个日期的密钥相同时才有效。 (又名,0 始终对应于 2014-04-01 )。 如果我必须处理这个问题,我可能会先看看如何创建这些数组,然后我会使用日期作为关键


0
投票

将每个数组中的相关子集合并到单个数组中,以便可以在单个循环中迭代所有数据。

循环时,如果第一次遇到日期值,请将整行保存为引用变量并将该引用推入结果数组中。如果再次遇到日期值,则仅访问单位值并将其添加到引用的单位值中。

以这种方式使用引用可以避免在循环后调用

array_values()
来删除临时键。

代码:(演示

$result = [];
foreach (array_merge($a[0]['sales'], $b[0]['sales'], $c[0]['sales']) as $row) {
    if (!isset($ref[$row['Date']])) {
        $ref[$row['Date']] = $row;
        $result[] =& $ref[$row['Date']];
    } else {
        $ref[$row['Date']]['Units'] += $row['Units'];
    }
}
var_export($result);
© www.soinside.com 2019 - 2024. All rights reserved.