Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么array_unique会将整数键更改为字符串键?_Php_Arrays - Fatal编程技术网

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

Php 为什么array_unique会将整数键更改为字符串键?,php,arrays,Php,Arrays,我有以下代码: $myAwesomeArray = array( 'value1', 'value2', 'value3', 'value3', 'value4', 'value4' ); $z = json_encode(array('all' => $myAwesomeArray)); var_dump('before', $z); $myAwesomeArray = array_unique($myAwesomeArray); $

我有以下代码:

$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的资料,不知道为什么会发生这种情况

我使用PHP5.3和PHP5.6在Windows7机器上测试了上述代码,在行为/输出方面没有任何差异

这是虫子吗?我应该这样报告吗?或者这是正常的行为?

使用这个

$myAwesomeArray = array_keys(array_flip($myAwesomeArray));
而不是线

   $myAwesomeArray = array_unique($myAwesomeArray);
这是根据你的要求

试试看,这应该行得通

当您使用array_unique时,您将得到此

的替代方法,键将保留,生成的数组不会重新编制索引

这在php中没有问题,但在javascript中,数组定义为0索引的顺序键

因此,当您生成json时,php会识别出这些键不是有效的javascript数组键,并将数组转换为对象。这是正确的

如果希望获得预期结果,则需要重新为数组编制索引:

$z = json_encode(array('all' => array_values($myAwesomeArray)));
                                ^^^^^^^^^^^^ generate a new array with just the values

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

它删除了第三个元素,因此PHP将其作为对象而不是简单的数组。您可以通过array_值来运行数组,以对其重新编制索引。@CharlotteDunois是的,这就是我所做的,以获得我想要的行为,但它仍然可能是一个bug。也许我会看看array_unique的实际实现,看看发生了什么,也许是故意的行为。不,这不是bug。在PHP中,数组可以有您想要的任何键,在Javascript中,它们是从0开始的数字索引,因此您不能跳过示例中的任何数字索引,3,这样您就得到了一个对象。但是,如果它们是数字键,如果键不是连续的,这真的很重要吗?它就不能忽略这个案子吗?@RaduMurzea不,它不能。您可能是故意这样创建数组的,所以PHP不能简单地忽略它。@RaduMurzea还注意到array_unique并没有像您在标题中提到的那样将键转换为字符串键,而是json_encode需要使用您提供的信息生成有效的json。细微但显然非常相关的区别。谢谢。@RaduMurzea这是由不同语言中数组的不同定义造成的。
$myAwesomeArray = array_values(array_unique($myAwesomeArray, SORT_REGULAR));