php - 如何合并每个数组具有不同元素的2d数组

时间:2013-07-19 03:06:56

标签: php arrays merge multidimensional-array

我有2组2d数组,我想合并成1个2d数组。但每个数组中的元素数量不相同,前两个元素是相同的,我不想复制它。 这是它。

前2d阵列:

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
           )
     )

第二个2d数组:

 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 export:

( 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', )

4 个答案:

答案 0 :(得分:3)

使用array_merge_recursive示例

$array = array_merge_recursive($array1, $array2);
 var_dump($array);

答案 1 :(得分:2)

如果两个数组的顺序相同,则代码非常简单:

$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
        )
)

答案 2 :(得分:0)

这很大程度上取决于你的实际目标。例如,从您的示例中,您似乎想要使用日期[index 0](可能还有时间[index 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"
  }
}
*/

答案 3 :(得分:0)

$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
        )

)