當前位置: 首頁> 最新文章列表> 為什麼array_change_key_case() 不能處理嵌套數組?

為什麼array_change_key_case() 不能處理嵌套數組?

M66 2025-04-25

在PHP 中, array_change_key_case()是一個實用的函數,可以將數組中所有鍵名轉換為小寫或大寫。但很多人在第一次使用這個函數時都會遇到一個問題:。這是為什麼?它的工作原理到底是怎樣的?本文將通過實例為你一一解析。

1. 這個函數的基本用法

先來看下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
)

可以看到,所有鍵名都變成了小寫。這一切看起來很完美。

2. 當數組有嵌套結構時……

讓我們加一個嵌套數組看看效果:

 $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()只對數組的第一層鍵名生效,不會遞歸處理嵌套數組。

3. 函數的工作原理

從官方文檔和源碼層面可以知道, array_change_key_case()的本質是對數組進行遍歷,並直接操作每一個頂級鍵名。如果某個值是數組類型,它不會進入內部進一步遞歸修改鍵名。

換句話說:

 foreach ($array as $key => $value) {
    $newKey = strtolower($key); // 或 strtoupper($key)
    $newArray[$newKey] = $value;
}

就是這麼簡單粗暴!沒有遞歸、沒有深入結構,效率很高,但也很“局限”。

4. 想支持嵌套怎麼辦?

如果你想讓嵌套數組的鍵名也一併轉換,就需要自己寫遞歸函數。例如:

 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
        )
)

現在一切看起來就合理多了!

5. 總結

  • array_change_key_case()是非遞歸的,只作用於數組第一層的鍵。

  • 如果需要對多維數組進行鍵名轉換,需要使用自定義遞歸函數。

  • 這也是很多PHP 內置函數的通病:簡單好用,但對複雜結構的支持有限。

希望這篇文章能幫你徹底搞清楚這個問題,下次寫處理數組的代碼時更得心應手!