如何合并两个关联数组并保留条目的全局顺序?

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;