PHPアレイを扱う場合、 array_flip()は、一見シンプルだが隠されたリスク関数です。その目的は、ユーザーが提供するデータに直接使用する場合、予想していない一連の問題をトリガーする可能性があります。
この記事では、例を介してarray_flip()の潜在的な落とし穴を分析し、より堅牢なPHPアプリケーションを構築するのに役立つより安全な代替品を提供します。
array_flip()の基本的な使用法は非常に直感的です:
$original = [
'apple' => 'fruit',
'carrot' => 'vegetable'
];
$flipped = array_flip($original);
print_r($flipped);
出力:
Array
(
[fruit] => apple
[vegetable] => carrot
)
値をキーに変更し、値のキーを変更します。これは、「値」に基づいて「キー」をすばやく見つけたい場合など、いくつかのシナリオで非常に便利です。しかし、問題はこの定義にも隠されています。
array_flip()では、すべての値が一意であり、フリップしたときにキーを利用できる必要があります。配列に値が重複している場合、エラープロンプトを与えずに以前のデータを静かに上書きします。
ユーザーデータの例を見てみましょう。
$userInput = [
'user1' => 'admin',
'user2' => 'editor',
'user3' => 'admin' // 値を繰り返します
];
$flipped = array_flip($userInput);
print_r($flipped);
出力は次のとおりです。
Array
(
[admin] => user3
[editor] => user2
)
管理者はuser1に対応すると思いますか?いいえ、 user3はそれをオーバーライドします。これは、ユーザーの役割、許可、タグ、その他のデータを処理する際に論理的なエラーを引き起こすのが簡単です。
PHPの配列キーは、整数または文字列のみです。ユーザーの送信配列に値として配列またはオブジェクトが含まれている場合、 array_flip()は警告をスローし、これらの要素を無視します。
$userInput = [
'key1' => 'value1',
'key2' => ['not' => 'allowed'],
'key3' => 'value3'
];
$flipped = array_flip($userInput);
print_r($flipped);
出力:
Warning: array_flip(): Can only flip STRING and INTEGER values!
Array
(
[value1] => key1
[value3] => key3
)
この警告は、開発環境で見られるかもしれませんが、生産環境に隠されているため、正常に見えるがデータが壊れている配列が得られます。
値が同じように見える場合でも、 array_flip()はタイプを厳密に区別します。たとえば、文字列「1」と整数1は同じキーとして扱われ、上書きを引き起こします。
$userInput = [
'a' => 1,
'b' => '1'
];
$flipped = array_flip($userInput);
print_r($flipped);
出力:
Array
(
[1] => b
)
キー「A」は完全に失われます。
値からバックチェックキーの機能が必要であるが、データソースが信頼できるものではない場合は、次の方法を使用できます。
$reverseMap = [];
foreach ($userInput as $key => $value) {
if (is_scalar($value)) {
$reverseMap[$value][] = $key;
}
}
これにより、すべての重複値に対応するキーを保持できます。
print_r($reverseMap);
出力:
Array
(
[admin] => Array ( [0] => user1 [1] => user3 )
[editor] => Array ( [0] => user2 )
)
array_flip()は、きれいで十分に構造化された内部データを処理する場合に非常に便利ですが、可能でない限りユーザーの入力には注意して使用します。
値が一意であることを確認してください
値がスカラー型(文字列または整数)であることを確認してください
あなたのフリップの目的をはっきりと知り、例外を処理する準備ができています
それ以外の場合は、隅にバグを静かに導入することができます。ある日、ユーザーがフォーラムの許可エラーについて不満を言うまで、犯人は無害なarray_flip()のラインであることに気付きます。
この記事があなたが隠されているが危険なピットを避けるのに役立つことを願っています。許可管理システムまたはデータマッピング機能を開発している場合は、 array_flip()を一時的にダウンして、より堅牢なソリューションを検討することもできます。
さらに調査するには、確認してください。
?? https://m66.net/php-manual/array_flip
?? https://m66.net/php-best-practics
同様の使用質問がある場合は、メッセージを残して議論してください。 PHPの世界は古いですが、詳細には悪魔が隠されていますか?