php索引数组与关联数组的区别

在大多数编程语言里面,数组一般是指有序的元素序列,所谓“有序”,表现为其下标按数字0,1,2,3,4……这种递增的方式排列。还有另一种叫键值对的数据结构,与数组不同,它没有下标,而是通过键名(key)来赋值取值,这种键值对结构一般都被当作对象来处理,有的语言里面叫Dict,有的语言里面叫Map,而在PHP里面仍叫数组,只不过加上了个修饰词,叫“关联”数组,而真正的数组在PHP里面被称之为“索引”数组。这两种数据结构在PHP里面都以Array来定义,由于其定义的方式都一样,所以比较容易产生混淆,混淆主要表现在将数据转成json操作的时候。

$arr = array('a','b','c');
$json = json_encode($arr);
echo $json;  //["a","b","c"]
$arr = json_decode($json);
print_r($arr);  //Array ( [0] => a [1] => b [2] => c )

对于真正的数组,以上的互转是没有问题的。

$arr = array('x'=>'a','y'=>'b','z'=>'c');
$json = json_encode($arr);
echo $json;  //{"x":"a","y":"b","z":"c"}
$obj = json_decode($json);
print_r($obj);  //stdClass Object ( [x] => a [y] => b [z] => c ) 

而对于键值对结构的数据,以上互转就有点小问题了,转过去然后再转回来,数据结构发生了改变,之前是Array,后面变成了stdClass Object,由此也说明,在PHP里面,由Array定义的数据其实是数组和对象(键值对)的结合体,在应该是数组的时候就是数组,在应该是对象(键值对)的时候就是对象(键值对),好像是自适应的。

//PHP判断数据结构是索引数组还是关联数组
if(array_keys($arr) === range(0, count($arr)-1)){
    echo '索引数组';
}else{
    echo '关联数组';
}