首先先需要弄清楚关于json两个比较重要的函数:

json_encode($data,[int $options = 0])将$data转化为json数据,$data可以是(除资源)外的任何数据类型,$options可以控制输出格式,例如JSON_FORCE_OBJECT(使一个非关联数组输出一个类,而非数组,当数组为空而需要一个类的时候很有用),JOSN_NUMERIC_CHECK(将数字字符串转化成数字格式)。

json_decode($data,[bool $assoc=false])用于将一个json格式的数据转化PHP变量,如果$assoc为true的话,返回数据,否则返回对象(默认为false)。

需要注意的是:

在使用json_encode($data)时,返回数据的结构,如果$data为一维数组(非索引)时,返回的是{"a":"apple","b":"banana","c":"cat"},为索引(array(1,2,3))时返回[1,2,3]

如果$data为二维数组(非索引)$data=array(array(1,2,3))时,返回结构为[[1,2,3]](数组格式),如果加上参数json_encode($data,JSON_FORCE_OBJECT)则返回{"0":{"0":1,"1":2,"2":3}}

如果$dat为二维数组(索引)$data=array('a'=>array(1,2,3),'b'=>array[4,5,6])时,返回结构为{"a":[1,2,3],"b":[4,5,6]}(对象格式),如果加上参数json_encode($data,JSON_FORCE_OBJECT)则返回{"a":{"0":1,"1":2,"2":3},"b":{"0":4,"1":5,"2":6}}

总结:刚开始用json的时候对返回数组的结构搞不太清楚(有时候返回数组格式,有时候返回对象格式),害怕取错数组(其实    取数据的方法是一样的,不会影响正常使用),这种返回结果的不同可以理解成在js中数组和对象的区别:

 1、对象是无序数据的集合,而数组时有序数据的集合

 2、数组的数据没有名称,而对象的数据是有名称的(属性)

例如

a=[1,2,3,4]
a['foo'] = 'hello';

在PHP中a.length=5,而在js中会输出4,原因是foo已经作为了a的属性

PS:当循环一个二维数组时,可以这么写

for(var s in data){
     for(var i in data[s]){
         alert(data[s][i].属性);//二层遍历可以使用data[s]表示
}
}