合并包含共享关联键的数组而不相互覆盖
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',
)
我正在使用多个 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',
)