當前位置: 首頁> 最新文章列表> array_change_key_case() 與array_merge() 結合時可能遇到的問題

array_change_key_case() 與array_merge() 結合時可能遇到的問題

M66 2025-05-11

在PHP 中處理數組時, array_change_key_case()array_merge()都是非常常用的函數。一個可以將數組的鍵統一轉為大小寫,另一個則用於合併數組。看上去兩者都很簡單直接,但當它們時,卻很容易踩坑,特別是在處理關聯數組時。

函數簡介

  • array_change_key_case(array $array, int $case = CASE_LOWER) : 將數組的所有鍵名轉換為小寫或大寫。

  • array_merge(array ...$arrays) : 合併一個或多個數組。

坑點解析:鍵名大小寫不敏感但區分大小寫的行為

PHP 中數組的鍵名在某些函數中會表現出不同的“敏感度”——比如array_merge()是區分大小寫的,而array_change_key_case()會統一大小寫。這就可能導致合併時出現“重複鍵未覆蓋”或“意外覆蓋”的問題。

示例一:預期之外的鍵覆蓋

$arr1 = ['Name' => 'Alice'];
$arr2 = ['name' => 'Bob'];

$result = array_merge(
    array_change_key_case($arr1, CASE_LOWER),
    array_change_key_case($arr2, CASE_LOWER)
);

print_r($result);

輸出:

 Array
(
    [name] => Bob
)

看起來正常,對吧?因為我們都統一為小寫了。但是如果你換個順序:

 $result = array_merge(
    array_change_key_case($arr2, CASE_LOWER),
    array_change_key_case($arr1, CASE_LOWER)
);

輸出:

 Array
(
    [name] => Alice
)

注意:覆蓋的值不同了!

這說明當你在使用array_merge()array_change_key_case()時,處理順序會直接影響結果。

示例二:未先轉換大小寫導致鍵重複

$arr1 = ['Name' => 'Alice'];
$arr2 = ['name' => 'Bob'];

$result = array_change_key_case(
    array_merge($arr1, $arr2), CASE_LOWER
);

print_r($result);

輸出:

 Array
(
    [name] => Bob
)

在這個例子中,雖然合併時array_merge()Namename為兩個不同的鍵,合併後才統一成小寫,這樣就只保留了後者Bob ,也就是“看似重複但其實兩個鍵都存在合併時”。

而你可能原本的意圖是希望以某個鍵為主來合併,這種寫法就可能產生非預期行為。

建議的用法和解決方式

為了避免這些坑,建議在使用這兩個函數時遵循以下規則:

  1. 先統一鍵名大小寫再合併:

     $result = array_merge(
        array_change_key_case($arr1, CASE_LOWER),
        array_change_key_case($arr2, CASE_LOWER)
    );
    
  2. 確保數據源中鍵的大小寫風格一致:最好在數據生成或來源階段就統一大小寫標準。

  3. 考慮使用array_replace() 替代array_merge():在某些場景中, array_replace()更符合“鍵覆蓋”的邏輯。

     $result = array_replace(
        array_change_key_case($arr1, CASE_LOWER),
        array_change_key_case($arr2, CASE_LOWER)
    );
    

小結

  • array_merge()區分鍵名大小寫的;

  • array_change_key_case()是用來統一鍵名大小寫的;

  • 兩者結合使用時,先後順序鍵的原始大小寫都會影響最終結果;

  • 實際開發中,切記在合併之前先做大小寫轉換,才能避免數據“意外丟失”。

在多系統或多源數據合併的應用場景,比如接口聚合(如https://api.m66.net/userinfohttps://api.m66.net/userdetail ),就特別容易出現這種坑。如果你不提前處理好大小寫,一不小心就可能把關鍵字段給“覆蓋”掉了還不自知。

希望這篇文章能幫你避坑!