[英]php, array_merge_recursive works well with string keys only
$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 - 字符串與int鍵是相同的
讓我們將這個問題分解為單獨的問題:
說實話,我不知道解決這個問題的簡單方法。 我不確定有沒有。 即使如此,我也不確定你真的想要它。 這樣的函數將導致數組具有字符串或數組的值。 你會如何處理這樣的陣列?
更新 :嗯,有一個。 您的示例已經顯示array_merge_recursive
將使用字符串鍵將值轉換為數組。 所以1 => 'foo'
將是0 => 'foo'
,但'foo' => 'bar'
將最終為'foo' => ['bar']
。 我真的不明白這種行為。
在這種情況下使用字符串鍵可以幫助你,但在了解了有關array_merge_recursive
更多信息后,我決定盡可能避免使用此函數。 在我問這個問題后,有人將其作為PHP 7.0中的錯誤歸檔,因為它在PHP 5.x中的工作方式不同。
array_merge_resursive
不保留整數鍵,而它對整數鍵有效: 如果輸入數組具有相同的字符串鍵,則這些鍵的值將合並到一個數組中,這是遞歸完成的,因此如果其中一個值是數組本身,則該函數會將其與相應的條目合並在另一個數組中。 但是,如果數組具有相同的數字鍵 ,則后面的值不會覆蓋原始值,但會附加 。
更糟糕的是,它在處理嵌套數組時處理方式不同:
$array1 = [30 => [500 => 'foo', 600 => 'bar']];
$array2 = [];
array_merge_recursive($array1, $array2);
//[0 => [500=> 'foo', 600 => 'bar']];
如此有效, array_merge_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
不會替換(它也會附加):
如果密鑰存在於第二個數組中,而不存在於第一個數組中,則它將在第一個數組中創建。
在許多情況下,這是期望的行為,並且由於命名函數不是PHP的最強點,因此您可以將此視為次要問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.