Php 在特定键上合并两个多维数组
假设我有以下数组:Php 在特定键上合并两个多维数组,php,multidimensional-array,array-merge,Php,Multidimensional Array,Array Merge,假设我有以下数组: Array ( [0] => Array ( [id] => 5 [name] => Education ) [1] => Array ( [id] => 4 [name] => Computers
Array
(
[0] => Array
(
[id] => 5
[name] => Education
)
[1] => Array
(
[id] => 4
[name] => Computers
)
[3] => Array
(
[id] => 7
[name] => Science
[4] => Array
(
[id] => 1
[name] => Sports
)
)
第二个:
Array
(
[0] => Array
(
[id] => 1
[title] => Sport
)
[1] => Array
(
[id] => 7
[title] => Sci
)
[3] => Array
(
[id] => 4
[title] => Comp
[4] => Array
(
[id] => 5
[title] => Edu
)
)
期望输出为:
Array
(
[0] => Array
(
[id] => 5
[name] => Education
[title] => Edu
)
[1] => Array
(
[id] => 4
[name] => Computers
[title] => Comp
)
[3] => Array
(
[id] => 7
[name] => Science
[title] => Sci
[4] => Array
(
[id] => 1
[name] => Sports
[title] => Sport
)
)
我已成功地将这些阵列与以下内容合并:
foreach($first as $key => $value){
$result[$key] = array_merge($first[$key], $second[$key]);
}
但输出组合不正确:
Array
(
[0] => Array
(
[id] => 5
[name] => Education
[title] => Sport
)
[1] => Array
(
[id] => 4
[name] => Computers
[title] => Sci
)
[3] => Array
(
[id] => 7
[name] => Science
[title] => Comp
[4] => Array
(
[id] => 1
[name] => Sports
[title] => Edu
)
)
问题是我想在同一id
上合并这些数组。
所需的输出排序应与第一个数组中的相同
我怎样才能做到这一点?非常感谢您的帮助。您的代码运行良好。你的期望完全不正确。例如,在一个数组中,第四个元素
id
包含1,但在另一个数组中,第四个元素id
是5,因此“将这些数组合并到同一个id上”没有任何意义,因为将第四个元素合并为一个元素也会合并它们的子元素,并且由于两个数组中都使用了id
,once值必须消失,因为数组中不能有两个相等的键
编辑
您必须手动合并,因为PHP函数根据键进行合并,而您希望根据内容进行合并:
$result = array();
foreach( $arrayA as $keyA => $valA ) {
foreach( $arrayB as $keyB => $valB ) {
if( $valA['id'] == $valB['id'] ) {
$result[$keyA] = $valA + $valB;
// or if you do not care output keys, just
// $result[] = $valA + $valB;
}
}
}
您只需执行嵌套循环并检查
id
值是否匹配,然后将title
添加到$first
(或name
添加到$second
)
只要两个数组中始终都有每个id,那么按照“id”字段对两个数组进行排序,然后让php进行合并怎么样
function cmp($a, $b) {
return ((int) $a['id'] < (int) $b['id']) ? -1 : 1;
}
usort($array1, 'cmp');
usort($array2, 'cmp');
$result = array_merge($array1, $array2);
函数cmp($a,$b){
返回((int)$a['id']<(int)$b['id'])?-1:1;
}
usort($array1,'cmp');
usort($array2,'cmp');
$result=array\u merge($array1,$array2);
没有测试代码,但它演示了这个想法。不要在foreach中使用foreach,当数组太大时,这可能会太慢
$idArray = array_column($secondArray,'title','id');
foreach($firstArray as $key => $val){
$firstArray[$key]['title'] = (isset($idArray[$val['id']])) ? $idArray[$val['id']] : 'some title';
}
确保项目顺序相同,然后:
$items = array_map(function($itemFirstArray, $itemSecondArray) {
return array_merge($itemFirstArray, $itemSecondArray);
}, $firstArray, $secondArray);
提供
PHP5.5+
中可用的替代方法
由于两个数组的顺序不同,请首先使用id
对数组进行索引
这将允许您在id
索引数组上使用
array\u replace\u recursive
将合并与两个数组集的索引关联相匹配的数组中的值
(可选)使用array\u值
重新索引数组,删除id
索引关联
例子
结果
Array
(
[0] => Array
(
[id] => 5
[name] => Education
[title] => Edu
)
[1] => Array
(
[id] => 4
[name] => Computers
[title] => Comp
)
[2] => Array
(
[id] => 7
[name] => Science
[title] => Sci
)
[3] => Array
(
[id] => 1
[name] => Sports
[title] => Sport
)
)
使用的3参数形式可以很容易地完成这项工作,通过
id
值重新索引second
数组,然后在first
数组上循环,合并匹配的second
值的内容(如果存在):
输出:
Array
(
[0] => Array
(
[id] => 5
[name] => Education
[title] => Edu
)
[1] => Array
(
[id] => 4
[name] => Computers
[title] => Comp
)
[3] => Array
(
[id] => 7
[name] => Science
[title] => Sci
)
[4] => Array
(
[id] => 1
[name] => Sports
[title] => Sport
)
)
与Will B.的答案相比,这有一个优势,即不会首先对数组重新编制索引。由于只调用了一次array\u列
,而没有调用array\u值
,因此它的速度也稍快一些(我的测试显示约为10%)
更新
通过使用(+
)(谢谢@mickmackusa),此代码实际上可以加速得更多:
这段代码的输出与上面相同,但运行速度又提高了10%
我已经更正了输出中的一些错误,对此表示抱歉。我想要的是在第二个数组中找到相同的id
,这里是$second[4]['id']
,并将它们合并到新数组中,就像这样:数组('id'=>5,'name'=>'Education','title'=>'Edu')
。这不可能吗?很有魅力,谢谢:)很抱歉这个标题有误导性。这个的时间复杂性是什么?O(n^2)?这肯定可以做得更好。这个未经测试的代码段的输出显然不正确。在确保两个数组正确排序的代码位上不使用yatta yatta可能是有意义的。需要明确的是,这种技术要求两个数组都包含完全相同的id相关数据。
Array
(
[0] => Array
(
[id] => 5
[name] => Education
[title] => Edu
)
[1] => Array
(
[id] => 4
[name] => Computers
[title] => Comp
)
[2] => Array
(
[id] => 7
[name] => Science
[title] => Sci
)
[3] => Array
(
[id] => 1
[name] => Sports
[title] => Sport
)
)
$second = array_column($second, null, 'id');
foreach ($first as &$subject) {
$subject = array_merge($subject, $second[$subject['id']] ?? []);
}
Array
(
[0] => Array
(
[id] => 5
[name] => Education
[title] => Edu
)
[1] => Array
(
[id] => 4
[name] => Computers
[title] => Comp
)
[3] => Array
(
[id] => 7
[name] => Science
[title] => Sci
)
[4] => Array
(
[id] => 1
[name] => Sports
[title] => Sport
)
)
$second = array_column($second, null, 'id');
foreach ($first as &$subject) {
$subject += $second[$subject['id']] ?? [];
}