1

我有两个数组,如下所示。我需要合并数组的内容,以便最后得到第三个数组所示的结构。我已经检查了 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
)

)

4

5 回答 5

2

使用array_merge_recursive

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

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

在此处查看现场演示

于 2013-05-14T11:19:25.467 回答
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

于 2013-05-14T11:18:10.293 回答
0

我可能会遍历数组并手动合并它们。

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

如果顶级数组没有严格匹配的键,您将遇到问题。

于 2013-05-14T11:13:59.250 回答
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'];
}
于 2013-05-14T11:14:03.213 回答
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 并设置最大深度。

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

于 2014-09-18T10:01:04.160 回答