计算 3d 数组中每个唯一的第二级数据集的总计

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

我正在尝试计算多维数组中唯一 DRIVER 值的总数。

输入:

$distance_covered = [
    '1_JAN_2017' => ['DRIVER_1' => [2, 5, 3],    'DRIVER_2' => [3, 2, 6, 9]],
    '2_JAN_2017' => ['DRIVER_1' => [3, 9],       'DRIVER_3' => [1, 4, 8]],
    '3_JAN_2017' => ['DRIVER_4' => [9],          'DRIVER_1' => [2, 7, 5, 2]], 
    '4_JAN_2017' => ['DRIVER_1' => [5, 3, 3, 2], 'DRIVER_4' => [4, 9, 8, 5]], 
    '5_JAN_2017' => ['DRIVER_2' => [8, 5],       'DRIVER_5' => [3, 9, 7]],
    '6_JAN_2017' => ['DRIVER_5' => [2, 1, 7, 5], 'DRIVER_4' => [1, 9, 6]], 
    '7_JAN_2017' => ['DRIVER_4' => [5, 2, 9],    'DRIVER_3' => [4, 1, 6]],
]; 

想要的结果:

[
    'DRIVER_1' => 51,
    'DRIVER_2' => 33,
    'DRIVER_3' => 24,
    'DRIVER_4' => 67,
    'DRIVER_5' => 34
]

这是每位司机在所有行程中行驶距离的总和

我尝试过这样的代码:

$res = array();
foreach($distance_covered as $value) {
    foreach($value as $key => $number) {
        (!isset($res[$key])) ?
            $res[$key] = $number :
            $res[$key] += $number;
    }
}
print_r($res);
php arrays multidimensional-array sum grouping
5个回答
1
投票

这个对我有用

$res = array();
foreach($distance_covered as $value)//the array which you have given us 
{
    foreach($value as $key => $number) //loop over array of date
    {
        if(!isset($res[$key]))//check if the key exist in over defined array if no then run this
        {
            $res[$key] = array_sum($number);// Sum all distances of that driver
            continue;//set the key and continue the foreach... 
        }
        $res[$key] += array_sum($number);// Sum all distances of that driver    
    }
}

print_r($res);      
die;

输出为

Array
(
    [DRIVER_1] => 51
    [DRIVER_2] => 33
    [DRIVER_3] => 24
    [DRIVER_4] => 67
    [DRIVER_5] => 34
)

1
投票

这应该有效:

$res = array();
foreach($distance_covered as $value) {
    foreach($value as $key => $number) {
        foreach ($number as $n) {
            if (isset($res[$key])) {
                $res[$key] += $n;
            } else {
                $res[$key] = $n;
            }
        }
    }
}

print_r($res);

1
投票

只需遍历数组的数组即可。

$distance_covered = array(
  '1_JAN_2017' => array('DRIVER_1' => array(2, 5, 3),'DRIVER_2' => array(3, 2, 6, 9)),
  '2_JAN_2017' => array('DRIVER_1' => array(3, 9), 'DRIVER_3' => array(1, 4, 8)),
  '3_JAN_2017' => array('DRIVER_4' => array(9), 'DRIVER_1' => array(2, 7, 5, 2)),
  '4_JAN_2017' => array('DRIVER_1' => array(5, 3, 3, 2), 'DRIVER_4' => array(4, 9, 8, 5)),
  '5_JAN_2017' => array('DRIVER_2' => array(8, 5), 'DRIVER_5' => array(3, 9, 7)),
  '6_JAN_2017' => array('DRIVER_5' => array(2, 1, 7, 5),  'DRIVER_4' => array(1, 9, 6)),
  '7_JAN_2017' => array('DRIVER_4' => array(5, 2, 9), 'DRIVER_3' => array(4, 1, 6)), );

// Counting.
$merged = [];
foreach ($distance_covered as $day => $stats) {
  foreach ($stats as $driver => $distances) {
    if (!isset($merged[$driver])) {
      $merged[$driver] = 0;
    }
    $merged[$driver] += array_sum($distances);
  }
}

// Display.
echo "<pre>";
print_r($merged);
echo "</pre>";

1
投票

你们很接近,但是...

    $res = array ();

    foreach ( $distance_covered as $value ) {
        foreach ( $value as $key=> $driver ) {
            if ( isset($res[$key]) == false ){
                $res[$key]=0;
            }
            $res[$key] += array_sum($driver);
        }
    }

    print_r($res);

第一个 foreach 只是将数据拆分为天。 第二个返回类似 $key = 'DRIVER_1' 和 $driver = array(3, 9) 的元素。 如果这是您第一次遇到这个驱动程序,那么您需要确保 $res 中的元素存在,因此将其设置为 0。

一旦您知道那里有一个元素,您就可以使用

+= array_sum($driver)
位添加值的总和(在本例中为 3 和 9)。
+=
只是简单地添加,而不必说
a=a+b
,您可以说
a+=b


0
投票

[讽刺的声音]我不敢相信每个人都忽略了这个基于函数的复杂的单行......

代码:(演示

var_export(array_map('array_sum', array_merge_recursive(...array_values($distance_covered))));

输出:

array (
  'DRIVER_1' => 51,
  'DRIVER_2' => 33,
  'DRIVER_3' => 24,
  'DRIVER_4' => 67,
  'DRIVER_5' => 34,
)

*这实际上肯定比任何其他发布的答案处理得慢。

  1. 使用
    array_values()
  2. 删除第一级关联键(日期字符串)
  3. 使用“splat 运算符”解压数组的数组
    (...)
    ,并将其输入到
    array_merge_recursive()
    以对值进行分组
  4. 通过使用
    array_sum()
     对每个子数组调用 
    array_map()
  5. 对子数组值求和

(这只是跳出框框思考的练习。)


除此之外,没有人建议使用空合并运算符,所以我将发布它的样子:

$driver_totals = [];
foreach ($distance_covered as $daily_log) {
    foreach ($daily_log as $driver => $distances) {
        $driver_totals[$driver] = ($driver_totals[$driver] ?? 0) + array_sum($distances);
    }
}
var_export($driver_totals);

如果您有一个特殊的场景,您只需要知道单个特定驾驶员的距离,您可以像这样调用

array_column()

$target_driver = 'DRIVER_4';
$total_distance = 0;
foreach (array_column($distance_covered, $target_driver) as $distances) {
    $total_distance += array_sum($distances);
}
echo "{$target_driver} drove for a distance of {$total_distance}";

*请注意,每个日期数组中驱动程序的顺序并不重要,因为

array_column()
足够智能,可以找到所需的距离子数组。


最后,如果您声明所有可能的驱动程序的白名单数组,您可以:

  • 控制输出中驱动程序的顺序
  • 避免重复的
    isset()
    条件
  • 确保输出中包含没有任何距离记录的驾驶员

代码:

$roster = ['DRIVER_6', 'DRIVER_5', 'DRIVER_4', 'DRIVER_3', 'DRIVER_2', 'DRIVER_1'];
$driver_totals = array_fill_keys($roster, 0);

foreach ($distance_covered as $daily_log) {
    foreach ($daily_log as $driver => $distances) {
        $driver_totals[$driver] += array_sum($distances);
    }
}
var_export($driver_totals);
© www.soinside.com 2019 - 2024. All rights reserved.