php - 我有两个数组,带有 id 和总数。如果 ID 相同,我想添加总数。我该怎么办?
问题描述
我有 2 个数组。像这样的东西。
$res1 = [
['ID' => 60,'TOTAL' => 500],
['ID' => 61,'TOTAL' => 600],
['ID' => 63,'TOTAL' => 500]
];
$res2 = [
['ID' => 60,'TOTAL' => 600],
['ID' => 61,'TOTAL' => 700],
['ID' => 64,'TOTAL' => 800]
];
我想将 $res1 和 $res2 数组与 ID 合并,如果 ID 相等,则对总数求和,否则如果 ID 不匹配,那么我也应该将其保留在数组中。
这是我已经尝试过的,并且需要帮助以在性能方面进行更多改进。
foreach ($res1 as $id1 => $val1) {
foreach ($res2 as $id2 => $val2) {
$r =array();
if ($val1['ID'] == $val2['ID']) {
$r['ID'] = $val1['ID'];
$r['TOTAL'] = $val1['TOTAL'] + $val2['TOTAL'];
}else{
// MISSING Something here
}
$result[] = $r;
}
}
预期结果应该是
$result = [
['ID' => 60,'TOTAL' => 1100],
['ID' => 61,'TOTAL' => 1300],
['ID' => 63,'TOTAL' => 500],
['ID' => 64,'TOTAL' => 800]
];
解决方案
在我给出这个答案之前,如果这来自一个数据库表,那么最好只在该层中进行求和。也就是说,当数组增长时,它会变慢。
我要做的是首先获取所有ID。然后根据所有 ID 循环,然后搜索它们各自的总数和总和。像这样:
$result = [];
$ids = array_unique(array_merge(array_column($res1, 'ID'), array_column($res2, 'ID')));
foreach ($ids as $id) {
if (empty($result[$id])) { // initialization
$result[$id] = ['ID' => $id, 'TOTAL' => 0];
}
$res1_key = array_search($id, array_column($res1, 'ID'));
$res2_key = array_search($id, array_column($res2, 'ID'));
$sum = array_sum([
$res1_key !== false ? $res1[$res1_key]['TOTAL'] : 0,
$res2_key !== false ? $res2[$res2_key]['TOTAL'] : 0,
]);
$result[$id]['TOTAL'] = $sum;
}
基本上获取第一个和第二个数组上存在的所有 id。根据IDS循环它,初始化容器,在两者上搜索ID总数,然后求和,然后将其分配到已初始化的容器中。
旁注:这仅考虑每个数组集的一个唯一 ID。如果两个数组中都有重复项,例如$res1
has two ID = 60
,则可以对其进行改造以array_keys
获取多个搜索值,而不是array_search
.
推荐阅读
- spring-boot - Google OAuth2 集成错误 400:redirect_uri_mismatch
- oracle - 尝试从 powershell 命令行使用 sqlplus 执行 sql 脚本
- django-comments - 了解 HTML 模板文件对上下文、传入参数、标签的访问?
- reporting-services - 如何消除 SSRS 表达式中的#error
- javascript - 使用 onclick JavaScript 函数添加价值
- android - 扩展图像提供程序
- sqlite - Electron 下使用 Prisma 的 SQL
- html - 无法在 css 中创建具有边框半径的所需曲线
- javascript - 用js给pdf文件添加白色背景色?
- jenkins - 在一个阶段失败并且其余阶段不运行后,如何将整个 Jenkins 管道构建标记为成功?