我正在尝试计算多维数组中唯一 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);
这个对我有用
$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
)
这应该有效:
$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);
只需遍历数组的数组即可。
$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>";
你们很接近,但是...
$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
。
[讽刺的声音]我不敢相信每个人都忽略了这个基于函数的复杂的单行......
代码:(演示)
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,
)
*这实际上肯定比任何其他发布的答案处理得慢。
array_values()
(...)
,并将其输入到array_merge_recursive()
以对值进行分组array_sum()
对每个子数组调用
array_map()
(这只是跳出框框思考的练习。)
除此之外,没有人建议使用空合并运算符,所以我将发布它的样子:
$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);