在PHP 中,處理數組時經常會遇到鍵名(key)大小寫轉換的需求,尤其是處理從外部來源(如表單、API 返回等)獲取到的關聯數組數據時。 array_change_key_case()就是一個用來統一數組鍵名大小寫的函數。然而,一個經常被忽略但又頗為關鍵的問題是:
array_change_key_case()是否會改變數組中“數字鍵”的大小寫?
根據PHP 官方文檔, array_change_key_case()的作用是:
返回其所有鍵都被轉換為大寫或小寫的數組。
但這僅適用於字符串類型的鍵,對於數字鍵,該函數不會進行任何修改。
下面是一個例子來演示它的實際行為:
<?php
$data = [
"Name" => "Alice",
"EMAIL" => "alice@example.com",
100 => "編號",
"AGE" => 30
];
$result = array_change_key_case($data, CASE_LOWER);
print_r($result);
?>
輸出結果:
Array
(
[name] => Alice
[email] => alice@example.com
[100] => 編號
[age] => 30
)
可以看到:
所有字符串鍵(如"Name" 、 "EMAIL" 、 "AGE" )被成功轉換成了小寫;
而數字鍵100保持不變,既沒有變成字符串,也沒有改變大小寫。
這是因為數字在PHP 中是無大小寫之分的。 PHP 中數組的鍵可以是字符串或整數(整型)。而大小寫轉換本質上只對字符串有效。因此, array_change_key_case()只會處理鍵為字符串的元素。
如果你通過API 請求返回了一組數組數據,想統一處理鍵名,可以使用此函數。但在處理過程中,你無需擔心數字索引的鍵被錯誤地轉換成字符串或發生變化。例如:
<?php
$json = '{
"UserID": 101,
"Username": "bob",
"Scores": {
"0": 90,
"1": 85,
"2": 88
}
}';
$data = json_decode($json, true);
$data = array_change_key_case($data, CASE_LOWER);
// 輸出 JSON 結構到前端
echo json_encode($data);
?>
前端依然可以使用.scores[0]這樣的方式訪問數據,不受影響。
如果你需要進一步處理數組中的嵌套結構(如遞歸地將所有層級的鍵名轉為小寫),可以封裝一個遞歸函數,但依舊不需要擔心數字鍵:
function array_change_key_case_recursive($arr, $case = CASE_LOWER) {
return array_map(function ($item) use ($case) {
if (is_array($item)) {
return array_change_key_case_recursive($item, $case);
}
return $item;
}, array_change_key_case($arr, $case));
}
? array_change_key_case()只對字符串鍵有效;
? 它不會修改數組中的數字鍵;
?? 數字鍵在PHP 中是嚴格的整型,不存在大小寫之說;
?? 若需遞歸處理嵌套數組,需手動封裝遞歸函數處理字符串鍵。
這樣就可以在開發中安心使用array_change_key_case() ,而不必擔心數字鍵被誤處理啦!