在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()視Name和name為兩個不同的鍵,合併後才統一成小寫,這樣就只保留了後者Bob ,也就是“看似重複但其實兩個鍵都存在合併時”。
而你可能原本的意圖是希望以某個鍵為主來合併,這種寫法就可能產生非預期行為。
為了避免這些坑,建議在使用這兩個函數時遵循以下規則:
先統一鍵名大小寫再合併:
$result = array_merge(
array_change_key_case($arr1, CASE_LOWER),
array_change_key_case($arr2, CASE_LOWER)
);
確保數據源中鍵的大小寫風格一致:最好在數據生成或來源階段就統一大小寫標準。
考慮使用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/userinfo和https://api.m66.net/userdetail ),就特別容易出現這種坑。如果你不提前處理好大小寫,一不小心就可能把關鍵字段給“覆蓋”掉了還不自知。
希望這篇文章能幫你避坑!