php,array\u merge\u recursive仅适用于字符串键
结果是:php,array\u merge\u recursive仅适用于字符串键,php,Php,结果是: $array1 = [ '1' => '11', 'b' => 1, 3 => 33, 8 => 8 ]; $array2 = [ '1' => '22', 'b' => 2, 3 => 44, 9 => 9 ]; $merged = array_merge_recursive($array1, $array2); 让我们看一下:唯一的部分是'b'键,它们
$array1 = [
'1' => '11',
'b' => 1,
3 => 33,
8 => 8
];
$array2 = [
'1' => '22',
'b' => 2,
3 => 44,
9 => 9
];
$merged = array_merge_recursive($array1, $array2);
让我们看一下:唯一的部分是'b'
键,它们实际上是有效的。我不想覆盖它的任何内容,而是将它们组合成一个数组。太好了!但是其他的数字键(int或string)都被弄错了。
我希望得到以下结果:
array(7) {
[0]=>
string(2) "11"
["b"]=>
array(2) {
[0]=>
int(1)
[1]=>
int(2)
}
[1]=>
int(33)
[2]=>
int(8)
[3]=>
string(2) "22"
[4]=>
int(44)
[5]=>
int(9)
}
可能吗
编辑:当然键“1”和1-string与int键是相同的让我们把这个问题分解成不同的问题:
array\u merge\u recursive
将使用字符串键将值转换为数组。所以1=>'foo'
将是0=>'foo'
,但是'foo'=>'bar'
将最终成为'foo'=>['bar']
。我真的不明白这种行为
在这种情况下,使用字符串键会对您有所帮助,但在了解了更多有关数组\u合并\u递归的内容后,我决定尽可能避免使用此函数。我问过有人把它作为一个文件归档,因为它在PHP5.x中的工作方式不同
您希望保留关键点,而array\u merge\u resursive
不保留整数关键点,而保留整数关键点:
如果输入数组具有相同的字符串键,则
这些键被合并到一个数组中,这就完成了
递归地,因此如果其中一个值是数组本身,则
函数将它与另一个数组中的对应项合并
也但是,如果数组具有相同的数字键,则后面的
值不会覆盖原始值,但将被追加
更糟糕的是,在处理嵌套数组时,它的处理方式不同:
[
'1' => ['11', '22']
'b' => [1, 2]
[3] => [33, 44]
[8] => 8,
[9] => 9
]
因此,实际上,array\u merge\u resursive
并不是真正的resursive
使用可解决此问题:
$array1 = [30 => [500 => 'foo', 600 => 'bar']];
$array2 = [];
array_merge_recursive($array1, $array2);
//[0 => [500=> 'foo', 600 => 'bar']];
请注意,PHP在不一致性方面是非常一致的。虽然array\u merge\u recursive
不是递归的,array\u replace\u recursive
不会替换(它还附加了以下内容):
如果密钥存在于第二个数组中,而不是第一个数组中,则它将被删除
在第一个数组中创建
在很多情况下,这是期望的行为,因为命名函数不是PHP的最强点,所以您可以将其视为一个次要问题。
这是预期的行为:如果输入数组具有相同的字符串键,那么这些键的值将合并为一个数组。但是,如果数组具有相同的数字键,则后面的值将不会覆盖原始值,而是会被追加。您可能必须手动执行此操作,而不是使用内置函数。这完全不同…不完全是这样array\u replace\u recursive
并不总是追加。根据文档,当第一个数组中的值是标量时,它将被第二个数组中的值替换,可以是标量或数组。当第一个数组和第二个数组中的值都是数组时,array_replace_recursive()将递归地替换它们各自的值
对于OP的这个示例,$array1['b']
和$array2['b']
的值都是数组
,因此它在那里工作正常。看看结果中的其他元素,Scalar
被Scalar
替换,并创建了任何不存在的键。“请注意,PHP在不一致性方面非常一致”-哈哈!
array_replace_recursive($array1, $array2);
//output:
//array:5 [
// 1 => "22"
// "b" => 2
// 3 => 44
// 8 => 8
// 9 => 9
//]