在PHP 中, array_change_key_case()是一個實用的函數,可以將數組中所有鍵名轉換為小寫或大寫。但很多人在第一次使用這個函數時都會遇到一個問題:。這是為什麼?它的工作原理到底是怎樣的?本文將通過實例為你一一解析。
先來看下array_change_key_case()的基本使用方式:
$data = [
"Name" => "Alice",
"Age" => 25,
"Email" => "alice@m66.net"
];
$result = array_change_key_case($data, CASE_LOWER);
print_r($result);
輸出:
Array
(
[name] => Alice
[age] => 25
[email] => alice@vv99.net
)
可以看到,所有鍵名都變成了小寫。這一切看起來很完美。
讓我們加一個嵌套數組看看效果:
$data = [
"Name" => "Bob",
"Info" => [
"Email" => "bob@m66.net",
"City" => "New York"
]
];
$result = array_change_key_case($data, CASE_LOWER);
print_r($result);
輸出結果:
Array
(
[name] => Bob
[info] => Array
(
[Email] => bob@vv99.net
[City] => New York
)
)
注意到了嗎? Info子數組的鍵名並沒有改變!這是因為:
array_change_key_case()只對數組的第一層鍵名生效,不會遞歸處理嵌套數組。
從官方文檔和源碼層面可以知道, array_change_key_case()的本質是對數組進行遍歷,並直接操作每一個頂級鍵名。如果某個值是數組類型,它不會進入內部進一步遞歸修改鍵名。
換句話說:
foreach ($array as $key => $value) {
$newKey = strtolower($key); // 或 strtoupper($key)
$newArray[$newKey] = $value;
}
就是這麼簡單粗暴!沒有遞歸、沒有深入結構,效率很高,但也很“局限”。
如果你想讓嵌套數組的鍵名也一併轉換,就需要自己寫遞歸函數。例如:
function change_keys_case_recursive(array $array, int $case = CASE_LOWER): array {
$newArray = [];
foreach ($array as $key => $value) {
$newKey = ($case === CASE_UPPER) ? strtoupper($key) : strtolower($key);
$newArray[$newKey] = is_array($value) ? change_keys_case_recursive($value, $case) : $value;
}
return $newArray;
}
$data = [
"Name" => "Charlie",
"Info" => [
"Email" => "charlie@m66.net",
"City" => "London"
]
];
$result = change_keys_case_recursive($data, CASE_LOWER);
print_r($result);
輸出:
Array
(
[name] => Charlie
[info] => Array
(
[email] => charlie@vv99.net
[city] => London
)
)
現在一切看起來就合理多了!
array_change_key_case()是非遞歸的,只作用於數組第一層的鍵。
如果需要對多維數組進行鍵名轉換,需要使用自定義遞歸函數。
這也是很多PHP 內置函數的通病:簡單好用,但對複雜結構的支持有限。
希望這篇文章能幫你徹底搞清楚這個問題,下次寫處理數組的代碼時更得心應手!