合并两个多维数组并重新索引所有子数组
Posted
技术标签:
【中文标题】合并两个多维数组并重新索引所有子数组【英文标题】:Merge two multidimensional arrays and reindex all subarrays 【发布时间】:2012-01-23 14:55:42 【问题描述】:我有两个数组,我想将这两个数组合并成一个数组。请查看以下详细信息:
第一个数组:
Array
(
[0] => Array
(
[a] => 1
[b] => 2
[c] => 3
)
[1] => Array
(
[a] => 3
[b] => 2
[c] => 1
)
)
第二个数组:
Array
(
[0] => Array
(
[d] => 4
[e] => 5
[f] => 6
)
[1] => Array
(
[d] => 6
[e] => 5
[f] => 4
)
)
我想要这个结果。有人知道怎么做吗?
Array
(
[0] => Array
(
[0] => 1
[1] => 2
[2] => 3
)
[1] => Array
(
[0] => 3
[1] => 2
[2] => 1
)
[2] => Array
(
[0] => 4
[1] => 5
[2] => 6
)
[3] => Array
(
[0] => 6
[1] => 5
[2] => 4
)
)
希望您已经理解了这个问题。 提前谢谢你。
【问题讨论】:
使用array_merge有什么问题吗? @JonStirling 是的,如果您想要 OP 指定的结果,那么它将保留原始数组的键。请注意,他的答案对他的子数组有基于 0 的索引。不管是不是他需要的结果,只有他能回答! 我没有看到 array_merge 的问题。看起来像 OP:codepad.org/Bf5VpZOr array_merge 函数不会给我想要的结果。正如liquevicar 所说,我想要子数组的基于0的索引。 【参考方案1】:作为纯原生函数解决方案,合并数组,然后重新索引每个子数组。
代码:(Demo)
$a = [
['a' => 1, 'b' => 2, 'c' => 3],
['a' => 3, 'b' => 2, 'c' => 1],
];
$b = [
['d' => 4, 'e' => 5, 'f' => 6],
['d' => 6, 'e' => 5, 'f' => 4],
];
var_export(
array_map('array_values' array_merge($a, $b))
);
输出:
array (
0 =>
array (
0 => 1,
1 => 2,
2 => 3,
),
1 =>
array (
0 => 3,
1 => 2,
2 => 1,
),
2 =>
array (
0 => 4,
1 => 5,
2 => 6,
),
3 =>
array (
0 => 6,
1 => 5,
2 => 4,
),
)
【讨论】:
【参考方案2】:已修复(再次)
function array_merge_to_indexed ()
$result = array();
foreach (func_get_args() as $arg)
foreach ($arg as $innerArr)
$result[] = array_values($innerArr);
return $result;
接受不限数量的输入数组,将所有子数组作为索引数组合并到一个容器中,并返回结果。
EDIT 03/2014:提高了可读性和效率
【讨论】:
这会保留数组中的原始键,这不是他正在寻找的结果(至少不是来自问题中的数据)。 @liquorvicar 不,这不是函数的重点,否则我只会说“使用 array_merge()”。我使用[]
转换为索引,尽管没有最后一个循环方法的array_values()
可以说更好。
啊,好吧,我确实运行了你的代码,但它对我不起作用,但看看你编辑的帖子,它一定是我运行的旧版本。
是的,我发布了两个稍微错误的版本,但我意识到它们是错误的并修复了它们:-)【参考方案3】:
更简单现代的方式是:
$merged = $array1 + ['apple' => 10, 'orange' => 20] + ['cherry' => 12, 'grape' => 32];
php 5.4 中的新数组语法
【讨论】:
数组联合运算符不适合这个特定的问题。您的 sn-p 只会损坏数据。失败证明:3v4l.org/XWNmj【参考方案4】:如果您想返回您在问题中指定的确切结果,那么类似的方法将起作用
function array_merge_no_keys()
$result = array();
$arrays = func_get_args();
foreach( $arrays as $array )
if( is_array( $array ) )
foreach( $array as $subArray )
$result[] = array_values( $subArray );
return $result;
【讨论】:
Sooo...这只是接受的答案的副本,并附加了不必要的is_array()
?
@mickmackusa 这不是“副本”。该答案最初与现在接受的答案同时发布(当时是错误的,此后已被编辑)。是否需要额外的is_array()
检查确实取决于具体情况。如果没有 out,如果任何输入是标量值而不是数组,则代码将出错。如果您可以保证输入始终是数组,那么是的,这是不必要的。根据情况,您可能会强制转换为数组,而不是使用 is_array
进行检查(并对二级值执行相同的操作)。【参考方案5】:
试试array_merge
:
$result = array_merge($array1, $array2);
【讨论】:
此答案不正确,因为 ot 无法产生所需的结果。证明:3v4l.org/FodoK以上是关于合并两个多维数组并重新索引所有子数组的主要内容,如果未能解决你的问题,请参考以下文章