今天发现我同一个接口,用不同的账号去请求的时候,会出现数据类型不一样的情况,导致前端js报错
-
正常情况下,没有使用走到unset的情况,请求接口数据返回是这样的
image.png
users:[{},{},{},{}....{}]
我们发现在users的类型是数组,最外层用数组包裹着。
-
使用另一个账号登录,请求同一个接口,这次有走进代码的unset,返回的数据突然就变成对象,也就是用{}包裹的
image.png
很明显发现users是这样一个格式,最外层使用的是{}包裹,而且仔细看,每个{}里的元素有显示他的下标,并且是不连贯的(通过unset函数)
users:{0:{},1:{},3:{},.....8:{}}
这样返回的数据,很显然在同一个页面,前端是没办法处理的,所以报了这样的错误,前端也不知道什么原因

我到php调试代码,发现,只要有走进unset的那一次请求,全部会出现,users的从数据转成对象的情况。
[{},{},{}] => {0:{},1:{},3:{}}
查了官方文档才知道,php unset对json_encode() 的影响 ,因为我在return 到前端的时候,还是用了laravel自带的response()->json([])这个方法,也是相当于json_encode()。
解决办法:
我使用 array_values() 函数重置了被unset操作过的数组下标,使它变成连贯的数组,这样再json_encode
就不会出现数据类型转换的情况了
注:因为我的users数组里的下表都是索引下表,所以我使用这个函数对我的数据没有影响
原因:json_encode() 对非连贯的数组,或者非索引下表的数组,转化之后会变成{} 包裹的格式,因为使用了unset,把原先索引下标按顺序的数组改变了,变成不连贯数组,所以会变成{}包裹的数据格式。
原因的参考文章链接:https://www.cnblogs.com/saysmy/p/9957734.html

