如何合并两个关联数组并保留条目的全局顺序?
How can I merge two associative arrays and preserve the global order of the entries?
我有两个这样的数组:
$arr1 = ['a' => '1','b' => 2];
$arr2 = ['h' => 'c','j' => '3'];
我想将它们合并到这个结果中:
$newArr = ['a' => '1','h'=>'c','b'=>2,'j' => '3'];
这意味着我想合并它们,以便条目的全局顺序与源数组中的顺序相同。换句话说,压缩并展平。
array_merge
不会这样做。有什么解决办法吗?
您可以使用 array_merge() 或 array_merge_recursive()。
合并一个或多个数组的元素,以便将一个数组的值附加到前一个数组的末尾。该函数的结果是一个新数组。
https://www.php.net/manual/ru/function.array-merge.php
array_merge_recursive() 函数合并两个或多个数组的元素,其中一个数组的值附加到另一个数组的末尾。 Returns 结果数组。
如果输入的数组有相同的字符串键,那么将那些键的值合并到一个数组中,这是递归完成的,这样如果其中一个值是数组,那么函数将它与另一个数组中的相应值合并。但是,如果数组具有相同的数字键,则每个连续的值不会替换原始值,而是添加到数组的末尾。
https://www.php.net/manual/ru/function.array-merge-recursive.php
您可以使用array_merge函数,该函数用于将两个或多个数组合并为一个数组。
$arr1 = ['a' => '1','b' => 2];
$arr2 = ['h' => 'c','j' => '3'];
$result=array_merge($arr1,$arr2);
var_dump($result);
//output:- array(4) { ["a"]=> string(1) "1" ["b"]=> int(2) ["h"]=> string(1) "c" ["j"]=> string(1) "3" }
请注意,此解决方案仅在两个数组长度相同时才有效:
$arr1 = [ 'a' => '1', 'b' => 2 ];
$arr2 = [ 'h' => 'c', 'j' => '3' ];
$count = count($arr1);
$keys1 = array_keys($arr1);
$keys2 = array_keys($arr2);
$result = [];
for ($i = 0; $i < $count; $i++) {
$key1 = $keys1[$i];
$result[$key1] = $arr1[$key1];
$key2 = $keys2[$i];
$result[$key2] = $arr2[$key2];
}
print_r($result);
输出:
Array
(
[a] => 1
[h] => c
[b] => 2
[j] => 3
)
根据下面 mickmackusa 的评论编辑。
第一个是在构建新结构时循环使用输入数组的解决方案。如果您在其他地方需要它们,您始终可以缓存输入的单独副本。
即使两个数组的长度不同,下面的所有解决方案也都有效——任何剩余的元素都将在循环后附加到结果数组的末尾。
代码:(Demo)
$result = [];
while ($arr1 && $arr2) {
$result += array_splice($arr1, 0, 1)
+ array_splice($arr2, 0, 1);
}
$result += $arr1 + $arr2;
var_export($result);
另一种不使用输入数组的方法是构建查找数组:
代码:(Demo)
$max = max(count($arr1), count($arr2));
$keys1 = array_keys($arr1);
$keys2 = array_keys($arr2);
$result = [];
for ($x = 0; $x < $max; ++$x) {
if (isset($keys1[$x])) {
$result[$keys1[$x]] = $arr1[$keys1[$x]];
}
if (isset($keys2[$x])) {
$result[$keys2[$x]] = $arr2[$keys2[$x]];
}
}
var_export($result);
或者您可以使用 array_slice()
一次从每个数组中分离出一个元素,而不会损坏输入数组,也不会生成警告。
代码:(Demo)
$result = [];
for ($i = 0, $count = count($arr1); $i < $count; ++$i) {
$result += array_slice($arr1, $i, 1)
+ array_slice($arr2, $i, 1);
}
$result += $arr1 + $arr2;
我有两个这样的数组:
$arr1 = ['a' => '1','b' => 2];
$arr2 = ['h' => 'c','j' => '3'];
我想将它们合并到这个结果中:
$newArr = ['a' => '1','h'=>'c','b'=>2,'j' => '3'];
这意味着我想合并它们,以便条目的全局顺序与源数组中的顺序相同。换句话说,压缩并展平。
array_merge
不会这样做。有什么解决办法吗?
您可以使用 array_merge() 或 array_merge_recursive()。
合并一个或多个数组的元素,以便将一个数组的值附加到前一个数组的末尾。该函数的结果是一个新数组。 https://www.php.net/manual/ru/function.array-merge.php
array_merge_recursive() 函数合并两个或多个数组的元素,其中一个数组的值附加到另一个数组的末尾。 Returns 结果数组。
如果输入的数组有相同的字符串键,那么将那些键的值合并到一个数组中,这是递归完成的,这样如果其中一个值是数组,那么函数将它与另一个数组中的相应值合并。但是,如果数组具有相同的数字键,则每个连续的值不会替换原始值,而是添加到数组的末尾。 https://www.php.net/manual/ru/function.array-merge-recursive.php
您可以使用array_merge函数,该函数用于将两个或多个数组合并为一个数组。
$arr1 = ['a' => '1','b' => 2];
$arr2 = ['h' => 'c','j' => '3'];
$result=array_merge($arr1,$arr2);
var_dump($result);
//output:- array(4) { ["a"]=> string(1) "1" ["b"]=> int(2) ["h"]=> string(1) "c" ["j"]=> string(1) "3" }
请注意,此解决方案仅在两个数组长度相同时才有效:
$arr1 = [ 'a' => '1', 'b' => 2 ];
$arr2 = [ 'h' => 'c', 'j' => '3' ];
$count = count($arr1);
$keys1 = array_keys($arr1);
$keys2 = array_keys($arr2);
$result = [];
for ($i = 0; $i < $count; $i++) {
$key1 = $keys1[$i];
$result[$key1] = $arr1[$key1];
$key2 = $keys2[$i];
$result[$key2] = $arr2[$key2];
}
print_r($result);
输出:
Array
(
[a] => 1
[h] => c
[b] => 2
[j] => 3
)
根据下面 mickmackusa 的评论编辑。
第一个是在构建新结构时循环使用输入数组的解决方案。如果您在其他地方需要它们,您始终可以缓存输入的单独副本。
即使两个数组的长度不同,下面的所有解决方案也都有效——任何剩余的元素都将在循环后附加到结果数组的末尾。
代码:(Demo)
$result = [];
while ($arr1 && $arr2) {
$result += array_splice($arr1, 0, 1)
+ array_splice($arr2, 0, 1);
}
$result += $arr1 + $arr2;
var_export($result);
另一种不使用输入数组的方法是构建查找数组:
代码:(Demo)
$max = max(count($arr1), count($arr2));
$keys1 = array_keys($arr1);
$keys2 = array_keys($arr2);
$result = [];
for ($x = 0; $x < $max; ++$x) {
if (isset($keys1[$x])) {
$result[$keys1[$x]] = $arr1[$keys1[$x]];
}
if (isset($keys2[$x])) {
$result[$keys2[$x]] = $arr2[$keys2[$x]];
}
}
var_export($result);
或者您可以使用 array_slice()
一次从每个数组中分离出一个元素,而不会损坏输入数组,也不会生成警告。
代码:(Demo)
$result = [];
for ($i = 0, $count = count($arr1); $i < $count; ++$i) {
$result += array_slice($arr1, $i, 1)
+ array_slice($arr2, $i, 1);
}
$result += $arr1 + $arr2;