最近、数十万の値を含む配列に問題がありました。唯一必要なのは、値がすでに存在するかどうかをチェックすることでした。 私の場合、これはWebサーバーログからのIPです。 だから、基本的のようなもの:検索時間が劇的に増加し、検索の10Kは約17秒ほどかかりましたがPHPでは配列とは別のデータ構造がありますが、私はさまざまなインデックス手法を利用できますか?
in_array(ip2long(ip),$myarray)
は、ジョブ
をしました。
この場合、重複しているかどうかは気にしませんでした。存在を確認する必要がありました。だから私はこのようなインデックスにIPアドレスを格納することができ:
isset($myarray[ip2long($ip)])
とブーム、ルックアップ時間は10Kルックアップのために0.8秒の静的な時間まで17秒(およびそれ以上)から行ってきました。配列の値として、私はちょうどint 1
を使用しました。
おそらく配列インデックスは、log(n)検索時間とハッシュマップのインデックスを持つべきb-treeに基づいていると思います。
私の場合、インデックスはうまくいきましたが、値インデックスとしてハッシュマップを使用することができるデータ構造があります。複数の値があるかもしれません(重複があまりない範囲/検索リクエストを効率的に使用することはできません。ツリー構造の主な利点です)。
ときどき良い解決策があなたの目の前にあり、複雑すぎると思うことがあります。 - うまくやった。 – Smamatti
彼は私が理解しているところからそれをひっくり返した。 –
issetは構造体であり、array_key_exists()は関数なので、isset($ a [$ key])の使用はarray_key_exists($ key、$ a)よりもはるかに高速です! – BurninLeo