簡體   English   中英

php,array_merge_recursive只適用於字符串鍵

[英]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鍵是相同的

讓我們將這個問題分解為單獨的問題:

  1. 當第一個數組中存在第二個數組中的鍵時,您需要創建一個數組並將該值作為該數組的第一個元素。

說實話,我不知道解決這個問題的簡單方法。 我不確定有沒有。 即使如此,我也不確定你真的想要它。 這樣的函數將導致數組具有字符串數組的值。 你會如何處理這樣的陣列?

更新 :嗯,有一個。 您的示例已經顯示array_merge_recursive將使用字符串鍵將值轉換為數組。 所以1 => 'foo'將是0 => 'foo' ,但'foo' => 'bar'將最終為'foo' => ['bar'] 我真的不明白這種行為。

在這種情況下使用字符串鍵可以幫助你,但在了解了有關array_merge_recursive更多信息后,我決定盡可能避免使用此函數。 在我問這個問題后,有人將其作為PHP 7.0中錯誤歸檔,因為它在PHP 5.x中的工作方式不同。

  1. 你想保留密鑰,而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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM