php - 通过相同的键合并两个关联数组
问题描述
我有两个具有一个共同值的关联数组,例如
ARRAY 1(
[0]=>
array(2) {
["ID"]=> "AAAA"
["Name"]=> "Apple"
}
[1]=>
array(2) {
["ID"]=> "BBBB"
["Name"]=> "Avocado"
}
[3]=>
array(2) {
["ID"]=> "CCCC"
["Name"]=> "Banana"
}
)
Array2 (
[0]=>
array(4) {
["ID"]=> "AAAA"
["Taste"]=> "Yumi"
["Location"]=> "France"
["Price"]=> "Cheap"
}
[1]=>
array(4) {
["ID"]=> "CCCC"
["Taste"]=> "Yumi"
["Location"]=> "Africa"
["Price"]=> "Cheap"
}
[3]=>
array(4) {
["ID"]=> "BBBB"
["Taste"]=> "Yumi"
["Location"]=> "America"
["Price"]=> "Expansive"
}
[3]=>
array(4) {
["ID"]=> "HZGA"
["Taste"]=> "Berk"
["Location"]=> "Moon"
["Price"]=> "Expansive"
}
)
我想通过他们的 ID 合并它们。简单的合并是不可能的,因为它们没有排序,有 40.000 + 值并且没有相同的大小。
我计划使用双 foreach,并在 ID 很常见的情况下创建第三个数组,我放弃了这个想法。由于必须为第二个数组中的 40.000 个值中的每一个解析第一个数组中的 40.000 个值需要太长时间。
有什么解决办法吗?我想让它在 final 看起来像这样:
ArrayFinal (
[0]=>
array(4) {
["ID"]=> "AAAA"
["Name"]=> "Apple"
["Taste"]=> "Yumi"
["Location"]=> "France"
["Price"]=> "Cheap"
}
[1]=>
array(4) {
["ID"]=> "CCCC"
["Name"]=> "Banana"
["Taste"]=> "Yumi"
["Location"]=> "Africa"
["Price"]=> "Cheap"
}
[3]=>
array(4) {
["ID"]=> "BBBB"
["Name"]=> "Avocado"
["Taste"]=> "Yumi"
["Location"]=> "America"
["Price"]=> "Expansive"
}
)
解决方案
你无法避免循环。但是 foreach 非常快。在 50.000 的数组上进行了测试,耗时 0.04 秒。
这将做的是:
- 创建一个 TMP 数组
- 从 ARRAY1 获取 KEY 和 ID 值
- 将它们作为 'ID'=>key 放在 TMP 数组中
- 循环ARRAY2,获取ID
- 在TMP中查找对应的ID
- 从 ARRAY1 获取密钥
- 合并 ARRAY1 和 ARRAY2
您最终会得到来自 ARRAY2 的数据的 ARRAY1
$ar1=[...]; //original array 1
$ar2=[...]; //original array 2
// get ID=> key pairs
$kv=[];
foreach($ar1 as $k => $v){
$kv[ $v['id'] ] = $k;
}
// loop ARRAY2
foreach($ar2 as $k => $v){
if( array_key_exists( $v['id'] , $kv ) ){
$ar1[ $kv[$v['id']] ] = array_merge( $ar1[$kv[$v['id']]] , $ar2[$k] );
}
}
推荐阅读
- c++ - 为什么这个程序会遇到分段错误?
- javascript - 使用节点js和express-mysql-session在mysql数据库中存储会话不起作用
- assembly - ARM 汇编程序的异常行为
- grep - 如何使用 grep 提取大括号之间的内容?
- python - 如何在 django 中管理多个视图和 url?
- reactjs - next.js swr 我不想只在初始绘图时执行它
- c# - C#在datagridview中按回车键时如何移动更改焦点
- swift - 将输入节点连接到 AVAudioSinkNode 时出错
- javascript - Jquery 对 Jquery 创建的文本没有反应
- python - Python Discord,以用户身份连接