在大多数编程语言里面,数组一般是指有序的元素序列,所谓“有序”,表现为其下标按数字0,1,2,3,4……这种递增的方式排列。还有另一种叫键值对的数据结构,与数组不同,它没有下标,而是通过键名(key)来赋值取值,这种键值对结构一般都被当作对象来处理,有的语言里面叫Dict,有的语言里面叫Map,而在PHP里面仍叫数组,只不过加上了个修饰词,叫“关联”数组,而真正的数组在PHP里面被称之为“索引”数组。这两种数据结构在PHP里面都以Array来定义,由于其定义的方式都一样,所以比较容易产生混淆,混淆主要表现在将数据转成json操作的时候。
1 2 3 4 5 | $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 ) |
对于真正的数组,以上的互转是没有问题的。
1 2 3 4 5 | $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定义的数据其实是数组和对象(键值对)的结合体,在应该是数组的时候就是数组,在应该是对象(键值对)的时候就是对象(键值对),好像是自适应的。
1 2 3 4 5 6 | //PHP判断数据结构是索引数组还是关联数组 if ( array_keys ( $arr ) === range(0, count ( $arr )-1)){ echo '索引数组' ; } else { echo '关联数组' ; } |