我有两个数组,如下所示。我需要合并数组的内容,这样我就可以得到的结构显示在第三个数组最后。我已经检查了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()
方法感兴趣。