php - PHP数组总和和分组重复
问题描述
我有这个数组:
$statuses = ['PROSPECT','BACKLOG','PROSPECT'];
$of_tranxs = [2,1,2];
$revs = [3,1,3];
$mgps = [4,1,4];
我想按重复状态求和。输出这样的数组:
array(
'status' => ['PROSPECT','BACKLOG'],
'of_tranx' => [4,1],
'rev' => [6,1],
'mgp' => [8,1]
)
我正在使用 PHP 7.4
我尝试过以下方法:
$result = array_zip_combine(
['status', 'of_tranx', 'rev', 'mgp'],
$statuses, $of_tranxs, $revs, $mgps
);
然后我 foreach 但结果不是我想要的。
解决方案
您可以在原始数组中执行求和,然后在执行单个循环后重新索引并合并它们。我希望这是相当有效的,我认为它会很容易阅读和维护。
代码:(演示)
foreach ($statuses as $index => $status) {
if (!isset($found[$status])) {
$found[$status] = $index;
continue;
}
$of_tranxs[$found[$status]] += $of_tranxs[$index];
$revs[$found[$status]] += $revs[$index];
$mgps[$found[$status]] += $mgps[$index];
unset($statuses[$index], $of_tranxs[$index], $revs[$index], $mgps[$index]);
}
var_export([
'status' => array_values($statuses),
'of_tranx' => array_values($of_tranxs),
'rev' => array_values($revs),
'mgp' => array_values($mgps)
]);
或者通过维护一个新的索引递增变量可能更简单:(Demo)
$result = [];
$i = 0;
foreach ($statuses as $oldIndex => $status) {
if (!isset($newIndex[$status])) {
$newIndex[$status] = $i++;
$result['status'][] = $status;
$result['of_tranx'][] = $of_tranxs[$oldIndex];
$result['rev'][] = $revs[$oldIndex];
$result['mgp'][] = $mgps[$oldIndex];
} else {
$result['of_tranx'][$newIndex[$status]] += $of_tranxs[$oldIndex];
$result['rev'][$newIndex[$status]] += $revs[$oldIndex];
$result['mgp'][$newIndex[$status]] += $mgps[$oldIndex];
}
}
var_export($result);
Outputm(来自两个片段):
array (
'status' =>
array (
0 => 'PROSPECT',
1 => 'BACKLOG',
),
'of_tranx' =>
array (
0 => 4,
1 => 1,
),
'rev' =>
array (
0 => 6,
1 => 1,
),
'mgp' =>
array (
0 => 8,
1 => 1,
),
)
推荐阅读
- azure - 通过 OneDrive 部署新的 Azure 应用服务在尝试检索文件夹时卡住了
- github - 在 Github 上的 markdown 中隐藏脚本标签
- reactjs - React 获取 Laravel 身份验证用户
- reactjs - 使用 React.js 循环音频
- c++ - 了解如何在 C++ 中使用验证循环(帮助)
- javascript - RxJS Ajax如何获取响应cookie
- assembly - nasm:错误:16 位模式不支持指令
- c - “pointer->register_next->value”是否与 C 中的“pointer->register_next.value”相同?
- javascript - 视频中的可组合箭头函数示例?
- c - __restrict 相对于流行编译器的函数优化行为