PHPのコーディングにおけるベストプラクティスを考える準備記事 - 奇特なブログ
しばらく間隔が空きましたが、第三段です。
これは、以下の記事とかもあるので、結構有名な気もしますが、
でも、ちょいちょい第三引数未指定に起因したバグを見聞きするので、まだまだ存在するのではないかと。
もう、↑に書いてあるので、以上終了・・・いや、他にもあるんですよね。
in_arrayだと線形探索になるので、他の関数で行った方が良いのでは?と。
そこで、以下のコードを書いて、検証してみました。
other/in_array.php at master · kitoku-magic/other · GitHub
一つ注意点として、上記のGitHubの速度調査では、
in_array()の「第一引数が配列」のケースが無い(配列を指定できるのを知らなかったし、見たこともない)ので、
今後、修正が入る可能性がありますので、そこはご注意いただければと。
あと、見ての通り色々検証したので結構長くなってますが、要約としては以下の様な感じですね。
1.配列で値の存在チェックをしたい場合、チェックしたい値を事前に出来るだけキーに書いておく方が良い
2.PHPの仕様や関数の戻り値の仕様的に、チェックしたい値がキーに出来ない場合、array_flipでキーの変更をするぐらいなら、in_arrayを使った方が速い
3.ソースが読みにくいと思われる(存在"しない"値を返すので)が、array_diffとarray_diff_keyが結構速い
4.上記ソースのfinallyの所で色々検証しているが、in_arrayに限らず、どの関数も取扱注意な点はある
で、上記1と2に該当するのですが、
(1)PHPにおいて、HTMLのチェックボックスでPOSTされた時の配列の場合、どうするか
(2)DBからSELECTした時の配列の場合、どうするか
(3)CSVをパースした時の配列の場合、どうするか
(4)外部のAPIからデータ取得した時の配列の場合、どうするか
この辺の時にどうするかが、あると思いますね。
まず(1)は、以下は多次元ですが、1次元でも「配列のキーに任意の値を指定出来る」みたいですね。
普通に知らなかったですが(苦笑)
あと、AjaxでPOSTする場合なら、POSTする配列データを作る際に、
その時の配列のキーに値を設定しておくというのはあると思いますね。
で、この形式でPOST出来れば、配列内の存在チェックでキーでチェックする事が出来るかと。
また(2)ですが、どうやらこっちも、以下のやり方があるみたいですね。
今回の話とは少し逸れますが、「任意のキーで値をグルーピングする方法」も、以下にありましたね。
・・・これは、この企画やって良かったですね、普通に知らなかったので(笑)
また(3)は、パース後にループで回せば当然設定は出来ますけど、
パース「直後」に任意の項目の値をキーにねぇ・・・今後、CSV周りも予定があるので、その時にでも考えてみましょう。
(4)も、これは外部APIの仕様次第でしょうから、ということで。
ということで、今回のin_arrayがまさにそうですが、
今回のテーマである「値ではなく、キーを検索する」については、
結構イケそうですね。