現在の位置: ホーム> 最新記事一覧> なぜarray_change_key_case()がネストされた配列を処理できないのですか?

なぜarray_change_key_case()がネストされた配列を処理できないのですか?

M66 2025-04-25

PHPでは、 array_change_key_case()は、配列内のすべてのキー名を小文字または大文字に変換する実用的な関数です。しかし、この関数を初めて使用する場合、多くの人が問題に遭遇します。何故ですか?どのように機能しますか?この記事では、例を通じて1つずつ分析します。

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

気づきましたか?情報サブアレイのキー名は変更されていません!これは:

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の多くの組み込み関数でも一般的な問題です。それらはシンプルで使いやすいですが、複雑な構造に対するサポートは限られています。

この記事が、この問題を徹底的に理解し、次にコードを作成して配列を処理するときに、より便利になるのに役立つことを願っています。