数组在第二级合并

时间:2013-05-14 11:05:40

标签: php arrays

我有两个数组,如下所示。我需要合并数组的内容,以便最终得到第三个数组中显示的结构。我检查过array_merge,但无法弄清楚这是可能的。任何帮助赞赏。感谢。

array(
    (int) 0 => array(
        'gross_value' => '100',
        'quantity' => '1'
    ),
    (int) 1 => array(
        'gross_value' => '200',
        'quantity' => '1'
    )
)

array(
(int) 0 => array(
    'item_title_id' => '1',
    'order_id' => '4'
),
(int) 1 => array(
    'item_title_id' => '2',
    'order_id' => '4'
)
)

我应该得到像这样的合并数组

array(
(int) 0 => array(
    'gross_value' => '100',
    'quantity' => '1',
    'item_title_id' => '1',
    'order_id' => 4
),
(int) 1 => array(
    'gross_value' => '200',
    'quantity' => '1',
    'item_title_id' => '2',
    'order_id' => 4
)

5 个答案:

答案 0 :(得分:2)

使用array_merge_recursive

将所有数字键转换为字符串,(make为关联数组)

$result = array_merge_recursive($ar1, $ar2);
print_r($result);

请参阅live demo here

答案 1 :(得分:1)

怎么样:

$arr1 = array(
    0 => array(
        'gross_value' => '100',
        'quantity' => '1'
    ),
    1 => array(
        'gross_value' => '200',
        'quantity' => '1'
    )
);
$arr2 = array(
    0 => array(
        'item_title_id' => '1',
        'order_id' => '4'
    ),
    1 => array(
        'item_title_id' => '2',
        'order_id' => '4'
    )
);
$arr = array();
foreach($arr1 as $k => $v) {
    array_push($arr, array_merge($v, $arr2[$k]));
}
print_r($arr);

<强>输出:

Array
(
    [0] => Array
        (
            [gross_value] => 100
            [quantity] => 1
            [item_title_id] => 1
            [order_id] => 4
        )

    [1] => Array
        (
            [gross_value] => 200
            [quantity] => 1
            [item_title_id] => 2
            [order_id] => 4
        )

)

查看array_merge

答案 2 :(得分:0)

我可能会迭代数组并手动合并它们。

$result = array();
foreach ( $array1 as $key => $item )
{
    $result[$key] = array_merge($array1[$key], $array2[$key]);
}

如果顶级数组没有严格匹配的键,则会出现问题。

答案 3 :(得分:0)

如果你有$ array1和$ array2,试试这个:

foreach($array1 as $key1=>$innerArray){
    $array1[$key1]['item_title_id'] = $array2[$key1]['item_title_id'];
    $array1[$key1]['order_id'] = $array2[$key1]['order_id'];
}

答案 4 :(得分:0)

合并递归之类的问题是他们不知道何时停止。

在某些情况下,您希望停止遍历数组,只需获取给定值(如果存在)。

例如,如果您必须覆盖嵌套的配置数组,则可能不希望默认密钥在特定级别上保留。

这是我的解决方案:

public static function merge_lvl2(){
    $args = func_get_args();
    return static::merge($args, 2);
}

public static function merge($args, $maxDepth = null, $depth = 1)
{
    $merge = [];
    foreach($args as $arg) {
        if (is_array($arg)) {
            if (is_array($merge)) {
                if ($maxDepth == $depth) {
                    $arg += $merge;
                    $merge = $arg;
                } else {
                    $merge = array_merge($merge, $arg);
                }
            } else {
                $merge = $arg;
            }
        }
    }
    if ($maxDepth !== $depth) {
        foreach($args as $a) {
            if (is_array($a)) {
                foreach($a as $k => $v) {
                    if (isset($merge[$k]) && is_array($merge[$k])) {
                        $merge[$k] = static::merge([$merge[$k], $v], $maxDepth, $depth + 1);
                    }
                }
            }
        }
    }
    return $merge;
}

您可以根据需要传递任意数量的数组进行合并。

$merged = ClassName::merge_lvl2([..array1..], [..array2..], [..array3..], etc...);

它将停止在第2级合并,并接受该键的最后一个实例作为覆盖而不是合并。

您也可以直接使用args数组调用merge并设置最大深度。

如果没有设置最大深度,它将遍历整个阵列。