敲黑板!重点,要考!
PHP的数组在转JSON的时候,如果索引连续,则转成数组。如果索引不连续,则会转成对象! 背景:一次项目中,需要替换后台接口数据源。前端接口json数据返回需要的是数组。替换后在前端逻辑不变更的前提下数据获取出错。
其实呢,核心问题已经敲黑板划重点了。如果看完重点就恍然大悟呢,就没接下去看的需要了。如果还不明所以,且听我继续唠嗑。没人看的话我就当记录一次自己工作中踩的坑吧。
由于要重新获取后台的数据源,又要返回和之前接口规范一致的数据格式。在初次尝试中,改写完后台代码之后,前端的数据在某些指定为数组格式的数据源中,某个数据结构如下:
for(let i = 0 , len = this.list.length ; i < len ; i ++){
//业务逻辑
}
可见在循环体内执行的业务逻辑,当返回的数据变成了对象,是拿不到length的,打印出来
console.log(this.list.length); // undefinded;
那当然循环体内的所有业务逻辑也就自然不执行了。
当然,期初并没有意识到是PHP返回的数据格式悄悄的从原来规定的数组变成了对象了。
后台的数据输出格式是基本不变的。唯一区别的地方,新数据对源数据的输出,添加了一个排序控制。 在后台的循环中,根据数据权重进行了对数据重排。 本来的数据输出索引是 0,1,2.重排之后变成了1,2,0. 同样的数据,就是这个小坑,也就是前面那句重点
PHP的数组在转JSON的时候,如果索引连续,则转成数组。如果索引不连续,则会转成对象!
解决办法。在数据输出之前,用php的数组排序重新排序一次就可以了。 我用了的 ksort(),当然其他诸如 array_values() 也是可以的。只要让数组索引连续就行了。
至此,这个坑就告一段落,如有不才写错,欢迎指出,也欢迎留言就交流~谢过。
2020-01-02 22:11:32更新
之前用ksort()方法实现的排序今天遇到坑了,当原数组中只有一个元素且数字索引不为0的时候如
$data = [
1=>[params1,params2]
];
ksort($data);
return $data; //此处仍然会返回数组内索引为1的数组,从而导致json解析出来的数据从数组变为对象。
之后默默的改回用array_values()。官方的说明是这样的:
返回数组中所有的值并给其建立数字索引。
通俗的讲,就是去掉原来数组中的键名,只保留键值作为数据返回。并建立从零开始的数组。举个栗子:
$data = [
'usernamw'=>'DK',
'gender'=>'male',
'age'=>'26'
];
$newData = array_values($data);
return $newData; //此时$newData = [0=>'DK',1=>'male',2=>'26'];
如此,这样作为返回json到前端,就不会被解析成对象而是数组了。