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で調べた方が速くなります。