为什么array_unique将整数键更改为字符串键?

时间:2017-02-17 08:49:19

标签: php arrays

我有以下代码:

$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计算机上测试了上面的代码,但行为/输出没有区别。

这是一个错误吗?我应该这样报告吗?或者这是正常行为吗?

3 个答案:

答案 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));

这不是理想的解决方案,但在这种情况下有效。