我有两组2d数组,我想合并成一个2d数组。但每个数组中的元素数量不相同,前2个元素相同,我不想重复它。给你。
第一个二维阵列:
Array(
[0] => Array
(
[0] => 25/2/2013
[1] => 8.45 a.m
[2] => 9.98
)
[1] => Array
(
[0] => 25/2/2013
[1] => 8.46 a.m
[2] => 9.02
)
)
第二个二维阵列:
Array(
[0] => Array
(
[0] => 25/2/2013
[1] => 8.45 a.m
[2] => 1.23
[3] => 6.1
)
[1] => Array
(
[0] => 25/2/2013
[1] => 8.46 a.m
[2] => 1.75
[3] => 1.75
)
)
我如何得到这样的结果:
Array(
[0] => Array
(
[0] => 25/2/2013
[1] => 8.45 a.m
[2] => 9.98
[3] => 1.23
[4] => 6.1
)
[1] => Array
(
[0] => 25/2/2013
[1] => 8.46 a.m
[2] => 9.02
[3] => 1.75
[4] => 1.75
)
)
这是第一个数组的var导出:
( 0 => array ( 0 => '5/2/2013', 1 => '9:31:00 AM', 2 => '0.395', 3 => '0.395', 4 => '302.855', 5 => '0.563', ), 1 => array ( 0 => '5/2/2013', 1 => '9:33:00 AM', 2 => '0.383', 3 => '0.383', 4 => '303.431', 5 => '0.563', )
对于第二个阵列:
( 0 => array ( 0 => '5/2/2013', 1 => '9:31:00 AM', 2 => '-1.000', 3 => '-1.000', 4 => '-1.000', 5 => '-1.670', 6 => '-1.000', 7 => '-11.000', ), 1 => array ( 0 => '5/2/2013', 1 => '9:33:00 AM', 2 => '-1.000', 3 => '-1.000', 4 => '-1.000', 5 => '-1.670', 6 => '-1.000', 7 => '-11.000', )
如果两个数组的顺序相同,则代码非常简单:
$a = array(
array('5/2/2013', '9:31:00 AM', '0.395', '0.395', '302.855', '0.563'),
array('5/2/2013', '9:33:00 AM', '0.383', '0.383', '303.431', '0.563'),
);
$b = array(
array('5/2/2013', '9:31:00 AM', '-1.000', '-1.000', '-1.000', '-1.670', '-1.000', '-11.000'),
array('5/2/2013', '9:33:00 AM', '-1.000', '-1.000', '-1.000', '-1.670', '-1.000', '-11.000'),
);
$i = new MultipleIterator(MultipleIterator::MIT_NEED_ALL | MultipleIterator::MIT_KEYS_ASSOC);
$i->attachIterator(new ArrayIterator($a), 'a');
$i->attachIterator(new ArrayIterator($b), 'b');
$result = [];
foreach ($i as $v) {
$result[] = array_merge($v['a'], array_slice($v['b'], 2));
}
print_r($result);
基本上,您同时迭代两个数组,并通过将第一个数组与第二个数组合并(跳过公共部分)来为每个元素构建最终数组。
结果:
Array
(
[0] => Array
(
[0] => 5/2/2013
[1] => 9:31:00 AM
[2] => 0.395
[3] => 0.395
[4] => 302.855
[5] => 0.563
[6] => -1.000
[7] => -1.000
[8] => -1.000
[9] => -1.670
[10] => -1.000
[11] => -11.000
)
[1] => Array
(
[0] => 5/2/2013
[1] => 9:33:00 AM
[2] => 0.383
[3] => 0.383
[4] => 303.431
[5] => 0.563
[6] => -1.000
[7] => -1.000
[8] => -1.000
[9] => -1.670
[10] => -1.000
[11] => -11.000
)
)
使用array_merge_recursive
示例
$array = array_merge_recursive($array1, $array2);
var_dump($array);
这在很大程度上取决于您的实际目标是什么。例如,从您的示例来看,您似乎希望使用日期[index 0
](可能还有时间[inded 1
])作为排序的"主键",以控制数据的合并方式。
PHP中没有合适的函数来实现这一点(正如您所注意到的,array_merge_recursive
不能做您想要的事情):您必须自己滚动。有很多"边缘案例"需要考虑。
<?php
/**
* recursively merges each item in $a1 and $a2 if their indexes [0] and [1] match;
* appends the $a2 item instead if no matching item is found in $a1.
*
* @param array $a1 the first array to merge
* @param array $a2 the second array to merge
* @return array the merged array
*/
function key_01_merge( array $a1,array $a2 ){
// loop through each item in $a2
foreach( $a2 as $a2_item ){
// make sure it's an array with [0] and [1]
if(
! is_array( $a2_item )
|| empty( $a2_item[0] )
|| empty( $a2_item[1] )
){
// invalid; skip it
break;
}
// compare it to each item in $a1; checking for matching "keys"
foreach( $a1 as $a1_key => $a1_item ){
if(
! empty( $a1_item[0] )
&& ! empty( $a1_item[1] )
&& $a1_item[0] === $a2_item[0]
&& $a1_item[1] === $a2_item[1]
){
// merge the two arrays
// filter duplicate values
// assign resulting array to the original index in $a1
$a1[$a1_key] = array_unique(
array_merge_recursive( $a1_item,$a2_item )
);
// set this item as "false" so it won't be appended to $a1
$a2_item = false;
// stop; continue with next item in $a2
break;
}
}
// if $a2_item was merged, it is now false;
// otherwise, append it to the $a1 array
if( $a2_item ){
$a1[] = $a2_item;
}
}
// return the $a1 array
return $a1;
}
测试。
$a1 = [
0 => [
0 => '25/2/2013'
,1 => '8.45 a.m'
,2 => '9.98'
]
,1 => [
0 => '25/2/2013'
,1 => '8.46 a.m'
,2 => '9.02'
]
];
$a2 = [
0 => [
0 => '25/2/2013'
,1 => '8.45 a.m'
,2 => '1.23'
,3 => '6.1'
]
,1 => [
0 => '25/2/2013'
,1 => '8.46 a.m'
,2 => '1.75'
,3 => '3.5'
]
];
var_dump( key_01_merge( $a1,$a2 ) );
输出:
/*
array(2) {
[0]=>
array(5) {
[0]=>
string(9) "25/2/2013"
[1]=>
string(8) "8.45 a.m"
[2]=>
string(4) "9.98"
[5]=>
string(4) "1.23"
[6]=>
string(3) "6.1"
}
[1]=>
array(5) {
[0]=>
string(9) "25/2/2013"
[1]=>
string(8) "8.46 a.m"
[2]=>
string(4) "9.02"
[5]=>
string(4) "1.75"
[6]=>
string(3) "3.5"
}
}
*/
$out = array();
for ($i=0; $i<count($arr1); $i++){
$out[] = array_values(array_unique(array_merge($arr1[$i], $arr2[$i])));
}
var_dump($out);
输出:
Array
(
[0] => Array
(
[0] => 25/2/2013
[1] => 8.45 a.m
[2] => 9.98
[3] => 1.23
[4] => 6.1
)
[1] => Array
(
[0] => 25/2/2013
[1] => 8.46 a.m
[2] => 9.02
[3] => 1.75
)
)