奇特なブログ

「殊勝に値する行いや心掛け」を意味する、奇特な人になる為のブログです

PHPのコーディングにおけるベストプラクティスを考える:in_array関数

PHPのコーディングにおけるベストプラクティスを考える準備記事 - 奇特なブログ

しばらく間隔が空きましたが、第三段です。
これは、以下の記事とかもあるので、結構有名な気もしますが、
でも、ちょいちょい第三引数未指定に起因したバグを見聞きするので、まだまだ存在するのではないかと。

qiita.com

qiita.com

もう、↑に書いてあるので、以上終了・・・いや、他にもあるんですよね。

gallu.hatenadiary.jp

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次元でも「配列のキーに任意の値を指定出来る」みたいですね。

blog.felt-life.info

普通に知らなかったですが(苦笑)

あと、AjaxでPOSTする場合なら、POSTする配列データを作る際に、

その時の配列のキーに値を設定しておくというのはあると思いますね。

で、この形式でPOST出来れば、配列内の存在チェックでキーでチェックする事が出来るかと。

また(2)ですが、どうやらこっちも、以下のやり方があるみたいですね。

qiita.com

今回の話とは少し逸れますが、「任意のキーで値をグルーピングする方法」も、以下にありましたね。

kinocolog.com

・・・これは、この企画やって良かったですね、普通に知らなかったので(笑)

また(3)は、パース後にループで回せば当然設定は出来ますけど、

パース「直後」に任意の項目の値をキーにねぇ・・・今後、CSV周りも予定があるので、その時にでも考えてみましょう。

(4)も、これは外部APIの仕様次第でしょうから、ということで。


ということで、今回のin_arrayがまさにそうですが、

今回のテーマである「値ではなく、キーを検索する」については、

結構イケそうですね。