在项目中遇到一个奇怪的bug,返回的json数据格式时不时的不对.而json是由一个numeric数组组成的,但是有时候返回的却是带键名(0,1,2,3…)的数组.

经过排查将问题锁定在array_unique函数上.原来array_unique函数在给数组去除重复的时候,会先将numberic数组转换为带键名的数组,然后再去重.

糟糕的是:
在值里没有重复的情况下,array_unique不会对数组做任何改动,返回的仍然是numberic数组;
但是,在值里有重复项的情况下,返回的数字连键的序号都是不连续的.

例如:

1
array_unique(array(1, 1, 2));

返回的结果是:

1
2
3
4
5
6
array(2) {
[0]=>
int(1)
[2]=>
int(2)
}

这就不是numeric数组了,直接做json_encode,会输出一个json对象{“0”:1,”2”:2},而不是数组[1,2].

解决方法是,在array_unique之后,在做一个array_values:

1
2
3
array_values(array_unique(array(1, 1, 2))); 
//array_values()函数返回一个包含给定数组中所有键值的数组,
//但不保留键名。

问题便可解决.