我有以下代码:
$myAwesomeArray = array(
'value1',
'value2',
'value3',
'value3',
'value4',
'value4'
);
$z = json_encode(array('all' => $myAwesomeArray));
var_dump('before', $z);
$myAwesomeArray = array_unique($myAwesomeArray);
$z = json_encode(array('all' => $myAwesomeArray));
var_dump('after', $z);
因此,有一个由整数键隐式索引的数组,其中包含一些重复值。具有重复值非常重要,否则将不会发生下面描述的行为。
如您所见,我在JSON中转换数组以及通过array_unique()
函数传递它的结果。
我希望看到的输出类似于:
string(6) "before"
string(63) "{"all":["value1","value2","value3","value3","value4","value4"]}"
string(5) "after"
string(45) "{"all":["value1","value2","value3","value4"]}"
但是我看到了这一点:
string(6) "before"
string(63) "{"all":["value1","value2","value3","value3","value4","value4"]}"
string(5) "after"
string(61) "{"all":{"0":"value1","1":"value2","2":"value3","4":"value4"}}"
显然该函数确实删除了重复值,但它将键从整数更改为字符串,至少是json_encode()
看到它们的那些。
另一个奇怪的行为是,如果在通过array_unique()
传递数组之后,我会这样做:
var_dump(array_keys($myAwesomeArray));
然后打印在输出中标记为int
:
array(4) {
[0]=> int(0)
[1]=> int(1)
[2]=> int(2)
[3]=> int(4)
}
与json_encode()
输出的内容不匹配。
我阅读了有关array_unique()
的所有内容,但无法弄清楚为什么会发生这种情况。
我使用PHP 5.3和PHP 5.6在Windows 7计算机上测试了上面的代码,但行为/输出没有区别。
这是一个错误吗?我应该这样报告吗?或者这是正常行为吗?
答案 0 :(得分:2)
当您使用array_unique
时,密钥将保留,结果数组不会重新编入索引。
这在php中没问题,但在javascript中,数组有 - 按照定义 - 0索引,顺序键。
因此,当您生成json时,php会识别出键不是有效的javascript数组键,并将数组转换为对象。这是正确的。
如果你想要"期待"结果,您需要重新索引数组:
$z = json_encode(array('all' => array_values($myAwesomeArray)));
^^^^^^^^^^^^ generate a new array with just the values
答案 1 :(得分:0)
使用此
$myAwesomeArray = array_keys(array_flip($myAwesomeArray));
而不是行
$myAwesomeArray = array_unique($myAwesomeArray);
这符合您的要求。
试一试,这应该有用。
您将获得此link
的替代方案答案 2 :(得分:0)
$myAwesomeArray = array_values(array_unique($myAwesomeArray, SORT_REGULAR));
这不是理想的解决方案,但在这种情况下有效。