合并来自多个数组的行数据



我有两个数组,如下所示。我需要合并数组的内容,这样我就可以得到的结构显示在第三个数组最后。我已经检查了array_merge,但无法弄清楚这是可能的。感谢任何帮助。谢谢。

[
    ['gross_value' => '100', 'quantity' => '1'],
    ['gross_value' => '200', 'quantity' => '1']
]

[
    ['item_title_id' => '1', 'order_id' => '4'],
    ['item_title_id' => '2', 'order_id' => '4']
];
我应该得到一个像这样的合并数组:
[
    [
        'gross_value' => '100',
        'quantity' => '1',
        'item_title_id' => '1',
        'order_id' => 4
    ],
    [
        'gross_value' => '200',
        'quantity' => '1',
        'item_title_id' => '2',
        'order_id' => 4
    ]
]

Use array_merge_recursive:

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

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

查看现场演示

如何:

$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

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

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

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

如果你有$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'];
}

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

在某些情况下,您希望停止遍历数组,如果给定值存在,则直接取其值。

例如,如果你必须覆盖一个嵌套的配置数组,你可能不希望默认键停留在一个特定的级别。

这是我的解决方案:

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级停止合并,并接受键的最后一个实例作为重写而不是合并。

你也可以直接调用merge和一个args数组,并设置最大深度。

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

合并来自两个或多个数组(或来自具有3个或更多深度的多维数组的行)的最现代、最优雅、最简洁的方法是在每一行上调用array_merge()(也可以使用array_replace())。array_map()可以通过字符串名称调用array_merge,输入数据可以通过"展开运算符"分割为单个参数;(...)

OP的数组代码:(Demo)

var_export(
    array_map('array_merge', $arr1, $arr2)
);

上述技术将返回一个新索引的数组(尽管您可能没有注意到,因为示例输入数组一开始就被索引了)。如果输入数据具有关联的第一级键,则该技术将忽略并销毁它们。如果你有非数字的第一级键,并且想要合并这些键,那么array_merge_recursive()可能是理想的本地函数。

然而,必须指出的是,对于OP的样本数据array_merge_recursive() 不是正确的技术。

如果你有两个以上的数组,需要根据它们的位置合并它们的行,我的第一个代码片段可以方便地扩展。(演示)

var_export(
    array_map('array_merge', $arr1, $arr2, $arr3)
);

如前所述,可以使用展开操作符解包更深的数组,得到相同的结果。同样,包含行的子数组的数量可以是动态的。如果您的深度数组只有一个包含行的子数组,那么结果将是"扁平化"。顶层被移除的效果。

带有新数据结构的代码:(Demo)
$masterArray = [
    [
        ['gross_value' => '100', 'quantity' => '5'],
        ['gross_value' => '200', 'quantity' => '6']
    ],
    [
        ['item_title_id' => '1', 'order_id' => '3'],
        ['item_title_id' => '2', 'order_id' => '4']
    ],
    [
        ['foo' => 'bar1'],
        ['foo' => 'bar2']
    ]
];
var_export(
    array_map('array_merge', ...$masterArray)
);

公平地说,array_replace_recursive()确实使用OP的示例数据提供了所需的结果,但我发现该技术在语义上具有误导性。(演示)


说了这么多,你并不强制使用PHP的原生数组函数;你也可以使用经典循环——你将有几种方法来"unite"循环中的行。这种方法稍微少了一些D.R.Y.,因为您需要显式指定希望同步迭代的单独数组。只要确保您理解对不同质量的数据使用array_merge()array_replace()和联合运算符(+)时的细微差别。提示:当键冲突发生时,相应行中的关联非数字键数据将受到影响。当行共享关联键时,要小心使用不会覆盖错误数据的合并技术。

array_merge()创建一个新的数组:(array_merge() Demo) (array_replace() Demo) (+ Demo)

$result = [];
foreach ($arr1 as $i => $row) {
    $result[] = array_merge($row, $arr2[$i]);    
}
var_export($result);

或者,您可以使用相同的通用方法,但是您可以将数据合并到第一个数组中,而不是填充新的$result数组。

(array_merge() Demo) (array_replace() Demo) (+= Demo)

foreach ($arr1 as $i => &$row) {
    $row = array_merge($row, $arr2[$i]);    
}
var_export($arr1);

为了完整起见,如果您有一个索引数组的索引数组,那么您甚至可以使用array_push()的迭代调用和扩展操作符来实现类似的功能。这实际上是将后续数组中的行数据附加到第一个数组的行。

代码(演示):

$arr1 = [
    ['A', 'B', 'C'],
    ['F', 'G']
];
$arr2 = [
    ['D', 'E'],
    ['H', 'I', 'J', 'L']
];
foreach ($arr1 as $i => &$row) {
    array_push($row, ...$arr2[$i]);
}
var_export($arr1);

Stack Overflow的相关非重复内容:


    将一个数组的行数据与另一个数组部分合并:
    将一个数组的值列添加到另一个数组
    使用PHP转换子数组元素中的数组值
    合并两个多维数组,保留数字键,并合并数组内的值
  • 合并包含对象的数组:
    按一级索引合并包含对象的两个数组的行

  • 将元素从一个数组推送到另一个数组的行中(每行一个元素)

在上面的页面上,兔子洞更进一步,因为我已经将其他相关页面链接到它们。继续研究,直到你找到你需要的。

如果你正在使用Laravel,你可能对它的combine()collect()方法感兴趣。

相关内容

  • 没有找到相关文章

最新更新