在大多数编程语言里面,数组一般是指有序的元素序列,所谓“有序”,表现为其下标按数字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 '关联数组'; }
(ಥ_ಥ) 看不太懂。