現在の位置: ホーム> 最新記事一覧> array_change_key_case()の誤用は、キー名データの損失を引き起こします

array_change_key_case()の誤用は、キー名データの損失を引き起こします

M66 2025-04-28

PHP開発では、 array_change_key_case()は、配列内のすべてのキー名を大文字または小文字に変換できる非常に便利な機能です。しかし、あなたは知っていますか、

この問題がどのように発生するかを確認するために、具体的な例を見てみましょう。

1。関数の紹介

array_change_key_case(array $array, int $case = CASE_LOWER): array
  • $配列:入力配列。

  • $ case :オプションのパラメーター、デフォルトはcase_lower (小文字)、またはcase_upper (upperce)に設定できます。

2。危険な例:キーネームケースの競合はデータの損失を引き起こします

$data = [
    'Name' => 'Alice',
    'name' => 'Bob',
    'Age'  => 25,
];

$result = array_change_key_case($data, CASE_LOWER);

print_r($result);

出力結果:

 Array
(
    [name] => Bob
    [age] => 25
)

見たことがありますか? 'name' => 'Alice'はなくなりました!
これは、 「名前」「名前」は両方とも小文字に変換された後、 「名前」になり、 「アリス」「ボブ」に上書きされたためです。

3。なぜこれが起こっているのですか?

array_change_key_case()は、 「ケースが異なるが実際に同じ」キー名があるかどうかは検出されません。キー名を簡単かつ大まかに代替します。競合が発生すると、後ろのキーがフロントキーを上書きし、警告やエラーも受け取ることさえできません。

これは、複数のソースからデータを処理する場合に特に危険です。たとえば、フォームマージまたはAPIのマージを行っている場合、キー名間のケースの競合に気付かない場合、データは無意識のうちに失われます。

4.このピットを避ける方法は?

?方法1:競合を手動で確認します

array_change_key_case()を呼び出す前に、最初に元の配列にキーネームケースの競合があるかどうかを検出できます。

 function hasKeyCaseConflict(array $array): bool {
    $lowerKeys = [];
    foreach ($array as $key => $value) {
        $lower = strtolower($key);
        if (isset($lowerKeys[$lower])) {
            return true;
        }
        $lowerKeys[$lower] = true;
    }
    return false;
}

$data = [
    'Name' => 'Alice',
    'name' => 'Bob',
];

if (hasKeyCaseConflict($data)) {
    echo "キー名の間にケースの競合があります,変換する前に処理してください。";
} else {
    $result = array_change_key_case($data);
    print_r($result);
}

?方法2:マージする前にソースデータを標準化します

APIを介してプルされたコンテンツなど、外部データを処理している場合は、マージする前にデータを標準化するか、キー名ルールを指定できます。

 $apiData = json_decode(file_get_contents('https://m66.net/api/user'), true);

// ソースが信頼できると仮定します,統一された小文字で使用します
$safeData = array_change_key_case($apiData, CASE_LOWER);

5。概要

array_change_key_case()は単純で実用的な機能ですが、その潜在的な破壊性は無視することはできません。処理しているデータにキー名が重複している場合は、それを行う前によく考えてください!

??ヒント:

  • デフォルトの動作は、競合を促しません!

  • データは「静かに」上書きされる可能性があります!

  • データ統合シナリオが多いほど、それらを使用する必要があります!