PHPで配列が連想配列かどうかを判定する

とある開発で必要になったこともあり、任意の配列が連想配列なのか、通常の配列なのかを判定する関数を作ってみた。

基本的に配列が連想配列かどうかは配列キー(添え字)がすべて数値かどうかで判定できるので、キーだけ引っ張って来てそれらすべてが数値であるかを確認すればよいことになる。
早速、プロトタイプとして次のような関数を作ってみた。

実行結果を見てみると、

想定していた結果を返してくれる。
では、次にパフォーマンスを見てみる。検証用に下記のようなコードを組んで、

次のような大きなサイズの配列を判定させてみた。

う~ん、パフォーマンスが悪いな。
コード量は増えるけど、イテレータ方式に改めてみた。

これでもう一回測定…

処理時間が劇的に減った!

さらに、配列の参照渡しは不要なのでやめる。あと、わざわざ range() で比較配列作って数値添え字の連続性まで判定しなくても良いことに気づいた。むしろ、このままだと数値添え字が連続していないと連想配列として誤判定されてしまうので、その辺もあわせて修正した。
それではまた測定してみよう…

おぉ~、かなり良いパフォーマンスになった。
しかも連続していない数値添え字の通常配列に対しても正常な判定を行ってくれる。

多次元配列への対応

さて、ここで多次元配列の扱いをどうしようか迷った。

多次元配列とは、配列が入れ子になっている配列のことで、キーが数値添え字であっても値が配列であれば多次元化する。そもそも、PHPではキーの添え字が数値だろうか文字列だろうが、配列が入れ子になった多次元配列だろうが配列の定義は一つであり、それを区別したければ利用する側でいかようにもしてくださいというポリシーだ。
多次元配列を連想配列と見なすかどうかは利用シーンによるわけで、そんな曖昧な区分けを関数側には持たせられない。そこは引数で区分けできるようにしておくのが無難だ。

つまり、もし一次元のキーが数値添え字である多次元配列を連想配列として取り扱いたい場合には、第二引数に true を指定すれば良いようにしてみた。指定しなければデフォルト値として false となり、多次元配列は連想配列に含めない建付けだ。

──というわけで、最終ソースは下記の通り。

Leave a Reply

Your email address will not be published.