毎日のPHP開発では、アレイ検索操作は、アレイに値が存在するかどうかを判断したり、大きなアレイで特定の要素を頻繁に検索する必要があるなど、非常に一般的なシナリオです。 IN_ARRAY()は非常に直感的で使いやすい機能ですが、大きな配列や頻繁な検索シナリオに直面している場合、パフォーマンスが問題になる可能性があります。
この記事では、 array_flip()とin_array()を組み合わせて、より効率的なアレイ検索方法を実現する方法を紹介します。
in_array()は、値が配列に存在するかどうかを判断するためにPHPで使用される関数です。その構文は次のとおりです。
in_array($needle, $haystack, $strict = false)
この関数の基礎となる層は線形検索です。つまり、配列内の要素を1つずつ比較します。小さな配列の場合、これは問題ではありません。しかし、数千またはさらに多くの配列要素があり、検索操作が非常に頻繁に存在する場合、そのパフォーマンスはボトルネックになります。
サンプルコード:
$values = range(1, 100000);
if (in_array(99999, $values)) {
echo "見つかった!";
}
上記のコードが実行されると、各検索は配列全体を通過し、最悪の場合、100,000個の要素すべてを通過します。
array_flip()の関数は、配列のキーと値を交換することです。その時間の複雑さはo(n)ですが、値を検索する複雑さはo(1)になります。
例:
$values = range(1, 100000);
$flipped = array_flip($values);
if (isset($flipped[99999])) {
echo "見つかった!";
}
上記のコードでは、 array_flip()は値をキーに変換しますが、PHPでは、ハッシュテーブルのキー検索は非常に高速で、ほぼ一定の時間です。したがって、 Array_flip()の初期化にはオーバーヘッドがありますが、頻繁に検索シナリオでもたらすパフォーマンスの改善は膨大です。
より実用的なシナリオをシミュレートしましょう。たとえば、ユーザーのバッチが提出したIDがシステムの許可IDホワイトリストにあることを確認する必要があります。
$allowed_ids = [101, 205, 309, 402, 588, 999]; // ホワイトリスト
$submitted_ids = [205, 402, 777]; // ユーザーが送信されました ID
// 方法1:伝統的な方法,使用 in_array
foreach ($submitted_ids as $id) {
if (!in_array($id, $allowed_ids)) {
echo "ID {$id} 不在ホワイトリスト中,操作拒否。" . PHP_EOL;
}
}
// 方法2:最適化方法,使用 array_flip
$allowed_map = array_flip($allowed_ids);
foreach ($submitted_ids as $id) {
if (!isset($allowed_map[$id])) {
echo "ID {$id} 不在ホワイトリスト中,操作拒否。" . PHP_EOL;
}
}
ホワイトリストの許可_idsの数が大きくなると、方法2はメソッド1よりも大幅に高速になります。
array_flip()では、配列の値が一意である必要があり、それ以外の場合は重複した値が上書きされ、データ損失が発生します。
値がキータイプとして使用できない配列またはオブジェクトなどである場合、 array_flip()はエラーを報告するか、文字列に自動的に変換されるため、注意して使用します。
array_flip()を使用すると、値検索が頻繁に頻繁に表示され、配列が大きい場合にのみ、利点を反映できます。一度しか見れば、パフォーマンスを無駄にします。
array_flip()とin_array()を組み合わせることにより、頻繁な配列検索が必要なシナリオのパフォーマンスを大幅に改善できます。その中心的なアイデアは、「値の検索」を「キールックアップ」に変換し、PHPアレイハッシュテーブルの高速アクセス機能を活用することです。
この手法をマスターすることは、大量のデータを処理したり、システムのパフォーマンスを最適化する場合に非常に役立ちます。