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
)
ご覧のとおり、すべてのキー名は小文字になりました。それはすべて完璧に見えます。
ネストされた配列を追加して、効果を確認しましょう。
$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()は、配列の最初のレイヤーキー名でのみ有効であり、ネストされた配列を再帰的に処理しません。
公式のドキュメントとソースコードレベルから、 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の多くの組み込み関数でも一般的な問題です。それらはシンプルで使いやすいですが、複雑な構造に対するサポートは限られています。
この記事が、この問題を徹底的に理解し、次にコードを作成して配列を処理するときに、より便利になるのに役立つことを願っています。