gpt4 book ai didi

php, array_merge_recursive 仅适用于字符串键

转载 作者:可可西里 更新时间:2023-11-01 01:15:20 24 4
gpt4 key购买 nike

$array1 = [
'1' => '11',
'b' => 1,
3 => 33,
8 => 8
];
$array2 = [
'1' => '22',
'b' => 2,
3 => 44,
9 => 9
];

$merged = array_merge_recursive($array1, $array2);

结果是:

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)
}

让我们看一眼:唯一的部分是 'b' 键,它们实际上是有效的。我不想覆盖它的任何内容,而是将它们放在一个数组中。那挺好的!但是随后键其他数字键(int 或 string)被搞砸了。我想要这样的结果:

[
'1' => ['11', '22']
'b' => [1, 2]
[3] => [33, 44]
[8] => 8,
[9] => 9
]

可能吗?

编辑:当然键“1”和 1 - string 与 int 键是相同的

最佳答案

让我们把这个问题分解成单独的问题:

  1. 当第二个数组中的键存在于第一个数组中时,您想创建一个数组并将该值作为该数组的第一个元素。

老实说,我不知道解决这个问题的简单方法。我不确定有没有。即使,我不确定你真的想要它。这样的函数将导致数组的值是字符串数组。您将如何处理这样的数组?

更新:嗯,有一个。您的示例已经表明 array_merge_recursive 会将带有字符串键的值转换为数组。所以 1 => 'foo' 会是 0 => 'foo',但是 'foo' => 'bar' 最终会是'foo' => ['bar']。我真的不明白这种行为。

在这种情况下,使用字符串键会有所帮助,但在了解更多关于 array_merge_recursive 的信息后,我决定尽可能避免使用此函数。我问了之后 this question有人将其归档为 bug in it since PHP 7.0 ,因为它在 PHP 5.x 中的工作方式有所不同。

  1. 您想保留键,而 array_merge_resursive 不保留整数键,而它对整数键保留:

If the input arrays have the same string keys, then the values for these keys are merged together into an array, and this is done recursively, so that if one of the values is an array itself, the function will merge it with a corresponding entry in another array too. If, however, the arrays have the same numeric key, the later value will not overwrite the original value, but will be appended.

更糟糕的是,它在处理嵌套数组时的处理方式不同:

    $array1 = [30 => [500 => 'foo', 600 => 'bar']];
$array2 = [];
array_merge_recursive($array1, $array2);
//[0 => [500=> 'foo', 600 => 'bar']];

如此有效,array_merge_resursive 并不是真正的 resursive

使用 array_replace_resursive解决了这个问题:

array_replace_recursive($array1, $array2);
//output:
//array:5 [
// 1 => "22"
// "b" => 2
// 3 => 44
// 8 => 8
// 9 => 9
//]

请注意,PHP 在不一致方面非常一致。虽然 array_merge_recursive 不是递归的,但 array_replace_recursive 不会替换(它还会追加):

If the key exists in the second array, and not the first, it will be created in the first array.

在许多情况下,这是期望的行为,并且由于命名函数不是 PHP 的强项,您可以将其视为一个小问题。

关于php, array_merge_recursive 仅适用于字符串键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40725297/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com