PHP開発では、 array_change_key_case()は、配列内のすべてのキー名を大文字または小文字に変換できる非常に便利な機能です。しかし、あなたは知っていますか、
この問題がどのように発生するかを確認するために、具体的な例を見てみましょう。
array_change_key_case(array $array, int $case = CASE_LOWER): array
$配列:入力配列。
$ case :オプションのパラメーター、デフォルトはcase_lower (小文字)、またはcase_upper (upperce)に設定できます。
$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'はなくなりました!
これは、 「名前」と「名前」は両方とも小文字に変換された後、 「名前」になり、 「アリス」が「ボブ」に上書きされたためです。
array_change_key_case()は、 「ケースが異なるが実際に同じ」キー名があるかどうかは検出されません。キー名を簡単かつ大まかに代替します。競合が発生すると、後ろのキーがフロントキーを上書きし、警告やエラーも受け取ることさえできません。
これは、複数のソースからデータを処理する場合に特に危険です。たとえば、フォームマージまたはAPIのマージを行っている場合、キー名間のケースの競合に気付かない場合、データは無意識のうちに失われます。
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);
}
APIを介してプルされたコンテンツなど、外部データを処理している場合は、マージする前にデータを標準化するか、キー名ルールを指定できます。
$apiData = json_decode(file_get_contents('https://m66.net/api/user'), true);
// ソースが信頼できると仮定します,統一された小文字で使用します
$safeData = array_change_key_case($apiData, CASE_LOWER);
array_change_key_case()は単純で実用的な機能ですが、その潜在的な破壊性は無視することはできません。処理しているデータにキー名が重複している場合は、それを行う前によく考えてください!
デフォルトの動作は、競合を促しません!
データは「静かに」上書きされる可能性があります!
データ統合シナリオが多いほど、それらを使用する必要があります!