PHP

配列か連想配列か判定する

PHPは連想配列と配列の区別がないので、判別したい場合はこんなコードが必要。

<?php

if (array_values($arr) === $arr) {
echo '$arrは配列';
} else {
echo '$arrは連想配列';
}


具体例

<?php

/**
* 添え字が0から連続する数値(=配列とみなせる)ときにtrue
*/

function is_vector(array $arr) {
return array_values($arr) === $arr;
}

$arr1 = ['a','b','c']; //配列
$arr2 = ['a'=>'a', 'b'=>'b']; //添字が文字なので配列とは言えない
$arr3 = ['a', 2=>'b', 1=>'c']; //添え字の順番がおかしいので配列とは言えない

var_dump(is_vector($arr1)); //true
var_dump(is_vector($arr2)); //false
var_dump(is_vector($arr3)); //false


array_values()は連想配列のキーを数値に振りなおしてくれる関数です。配列の場合はarray_values()を作用させても元のままになりますので、作用前の配列と比較することで判定が可能です。

http://d.hatena.ne.jp/fbis/20091112/1258002754

こちらに書いてあるように素直にforeachでキーを調べていってもいいのですが、配列が単純な場合は、array_valuesを使ったワンライナーでも同等の速度になるようです。

配列の要素数が多い、配列の要素が複雑、などの場合はforeachで調べた方が速くなります。