如何根据值合并两个多维数组?

时间:2012-01-16 12:04:59

标签: php arrays multidimensional-array merge

嗨,我有两个像这样的阵列

array (
[0]=>array(
     [0]=>10,
     [1]=>Some Name..
),
[1]=>array(
     [0]=>11,
     [1]=>Some Name..    
),
[2]=>array(
     [0]=>13,
     [1]=>Some Name..    
 )
)

像这样的另一个数组

array (
[0]=>array(
     [0]=>13,
     [1]=>Viewed
    )
)

如何在不使用任何循环的情况下合并上面两个数组?任何PHP功能都可用于此?我需要这种出局

array (
     [0]=>array(
              [0]=>10,
              [1]=>Some Name..
     ),
     [1]=>array(
              [0]=>11,
              [1]=>Some Name..
     ), [2]=>array(
              [0]=>13,
              [1]=>Some Name..
              [2]=Viewed
     )
)

3 个答案:

答案 0 :(得分:7)

您可以使用PHP功能 array_merge_recursive 。 参见示例:

<?php
$ar1 = array("color" => array("favorite" => "red"), 5);
$ar2 = array(10, "color" => array("favorite" => "green", "blue"));
$result = array_merge_recursive($ar1, $ar2);
print_r($result);
?>

答案 1 :(得分:0)

<?php
$array1 = array("color" => "red", 2, 4);
$array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4);
$result = array_merge($array1, $array2);
print_r($result);
?>

更多细节检查:

http://php.net/manual/en/function.array-combine.php

http://php.net/manual/en/function.array-merge.php

另见

array array_merge(array $ array1 [,array $ ...]) array_merge_recursive() - 递归地合并两个或多个数组 array_combine() - 通过使用一个数组作为键而另一个数组作为其值来创建数组 数组运算符

答案 2 :(得分:0)

不会有非循环方式来实现这一点。也许您正在寻找基于函数的语法,但对于这种情况,我认为这只会引入不必要的卷积。

为了获得最佳效率,请生成一个兼作查找数组的结果数组。如果该键已存在于结果数组中,则只需将 [1] 值推入该行。如果您想重新索引结果,只需对其调用 array_values()

代码:(Demo)

$array1 = [
    [10, 'Some Name..'],
    [11, 'Some Name..'],
    [13, 'Some Name..'],
];

$array2 = [
    [13, 'Viewed']
];

$result = [];
foreach (array_merge($array1, $array2) as $row) {
    if (!isset($result[$row[0]])) {
        $result[$row[0]] = $row;
    } else {
        $result[$row[0]][] = $row[1];
    }
}

var_export($result);

函数风格:(Demo)

$result = [];
$merged = array_merge($array1, $array2);
array_walk(
    $merged,
    function($row) use(&$result) {
        if (!isset($result[$row[0]])) {
            $result[$row[0]] = $row;
        } else {
            $result[$row[0]][] = $row[1];
        }
    }
);

var_export($result);