合并包含共享关联键的数组而不相互覆盖

Merge arrays containing shared associative keys without overwriting each other

我正在使用多个 API 以平面数组形式返回数据。所有这些 API 都返回带有共享键的数组。

例如:

从 API A、B 和 C 返回数据:

$a = array(1 => "abc", 2 => "def");
$b = array(1 => "ghi", 2 => "jkl");
$c = array(1 => "mno", 2 => "pqr");

所有这些数组都有重复的数字键。我的要求是单个数组不会因键冲突而丢失值。

要求的结果:

array(
    "abc",
    "def",
    "ghi",
    "jkl",
    "mno",
    "pqr"
);

我尝试了 array_merge() 函数,但它覆盖了重复的键,array_merge_recursive() 函数将所有重复的键累积到另一个数组中。

试试这个......

$a=array(1=>"abc",2=>"def");
$b=array(1=>"ghi",2=>"jkl");
$c=array(1=>"mno",2=>"pqr");

$d = array();

foreach($a as $arr){
 array_push($d, $arr);
}

foreach($b as $arr){
 array_push($d, $arr);
}

foreach($c as $arr){
 array_push($d, $arr);
}
print_r($d);

输出是

Array ( [0] => abc [1] => def [2] => ghi [3] => jkl [4] => mno [5] => pqr )

我也用数组合并尝试了你的例子,它给了我以下 o/p。

Array ( [0] => abc [1] => def [2] => ghi [3] => jkl [4] => mno [5] => pqr )

这是创建包含所有值的数组的一种相当简短的方法,无论它们的键如何:

$z = array_merge(
    array_values($a),
    array_values($b),
    array_values($c)
)

您可以使用 array_merge or array_merge_recursive.

对于 array_merge,如果您使用字符串键,值将被覆盖,这意味着输出数组中该键只有一个值。

对于 array_merge_recursive,如果您使用数字键,该值将被覆盖,这意味着输出数组中该键只有一个值

因为您的键都是数字,您可以通过在新数组中使用可变表达式来“splat-pack”数据。这是一个 one-liner,完全不需要函数调用来生成所需的数据结构。

代码:(Demo)

$a = [1 => "abc", 2 => "def"];
$b = [1 => "ghi", 2 => "jkl"];
$c = [1 => "mno", 2 => "pqr"];

var_export(
    [...$a, ...$b, ...$c]
);

输出:

array (
  0 => 'abc',
  1 => 'def',
  2 => 'ghi',
  3 => 'jkl',
  4 => 'mno',
  5 => 'pqr',
)

array_merge() 提供相同的结果。 (Demo)

var_export(array_merge($a, $b, $c));

三种语言结构将做同样的事情。 (Demo)

$result = [];
foreach ($a as $result[]);
foreach ($b as $result[]);
foreach ($c as $result[]);
var_export($result);

或者,如果您希望合并结果数组中的键从 1 开始,您可以在单个 array_push() 调用中使用可变参数表达式。 (Demo)

array_push($a, ...$b, ...$c);
var_export($a);

输出:

array (
  1 => 'abc',
  2 => 'def',
  3 => 'ghi',
  4 => 'jkl',
  5 => 'mno',
  6 => 'pqr',
)

您不能使用数组联合运算符,因为它们会因键冲突而破坏元素。 (Demo)

var_export($a + $b + $c);

错误输出:

array (
  1 => 'abc',
  2 => 'def',
)