PHP 7.1 数组兼职竟然可以重复,如何去掉这个特性?

2017-01-19 12:58:50 +08:00
 ioioioioioioi
$a['test'] = 'hi';
$a['test'] = 'hello';

得到的结果是
[
    [test] => hi
    [test] => hello
]
而我实际想要的是:
[
    [test] => hello
]
5576 次点击
所在节点    PHP
64 条回复
haiyang416
2017-01-19 13:01:18 +08:00
按理说这样的情况不可能出现,能不能贴一下完整的代码!
haiyang416
2017-01-19 13:02:04 +08:00
感叹号应该是?
haiyang416
2017-01-19 13:10:27 +08:00
特意在 PHP 7 测试了一遍,没有遇到你这样的问题。
ioioioioioioi
2017-01-19 13:25:56 +08:00
@haiyang416 嗯,我测试了,没有出现,但是确实有:
[1111] => Array
(
[meta_description] => meta_description
[meta_description] => blalbal
)
neilwong
2017-01-19 13:26:02 +08:00
你逗呢?能测试好了再发帖么。
skydiver
2017-01-19 13:28:28 +08:00
请给出完整的可重现测试用例
anewg
2017-01-19 13:32:51 +08:00
https://3v4l.org/8LZNd

不懂楼主结果怎么弄出来的。。
skydiver
2017-01-19 13:35:11 +08:00
key 里面有不可见字符的话,也会有这种结果
比如:

$a = [];

$a["hell\u{2060}o"] = 1;
$a["hello"] = 2;
print_r($a);

输出
Array
(
[hell ⁠ o] => 1
[hello] => 2
)
skydiver
2017-01-19 13:35:44 +08:00
v2ex 自动排版了,输出是看不出空格的
ioioioioioioi
2017-01-19 13:45:48 +08:00
@skydiver
@anewg
@skydiver
@neilwong
@haiyang416

问题解决了,本来的代码是这样的:
$ret = array_combine($keys, $keys);
后面会对$ret 赋值(键值重复),
这样修改后没有重复的问题了:
$ret = $this->combineArr($keys);

protected function combineArr($arr)
{
return array_combine($arr, $arr);
}

不知道为什么会出现这种情况。
zi
2017-01-19 13:50:58 +08:00
@ioioioioioioi 眼睛都看花了,这修改前后有区别吗。。
explon
2017-01-19 13:55:14 +08:00
小学生都会上网了
ioioioioioioi
2017-01-19 14:00:28 +08:00
@zi 确实没什么区别,但是确实修复了我提到的 bug ,也是困惑中。。。
luziafy
2017-01-19 15:04:50 +08:00
总想搞个大事情
hheedat
2017-01-19 15:44:55 +08:00
你可能安装了假 PHP
shiny
2017-01-19 15:49:33 +08:00
这是想搞个大新闻啊,是不是什么隐藏字符在里面了。你要是代码能跑出来可以去官方报 bug 了
Roope
2017-01-19 15:56:14 +08:00
```
~ # php t.php
Array
(
[meta_description] => tom
)
~ # ls
t.php
~ # php -v
PHP 7.1.0 (cli) (built: Dec 15 2016 21:09:42) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.1.0-dev, Copyright (c) 1998-2016 Zend Technologies
with Zend OPcache v7.1.0, Copyright (c) 1999-2016, by Zend Technologies
```

无法复现
ioioioioioioi
2017-01-19 15:56:35 +08:00
@shiny 我按照这个方法确实重复的,要不你也跑跑看:
$keys = ['meta_description'];

$ret = array_combine($keys, $keys);

$ret['meta_description'] = 'tom';

echo '<pre>';print_r($ret);echo '</pre>';die;

# 得到结果
Array
(
[meta_description] => meta_description
[meta_description] => tom
)
qiayue
2017-01-19 15:57:42 +08:00
你用 array_keys 获取最后数组的键数组后,判断一下两个键是否相同
qiayue
2017-01-19 15:59:20 +08:00
楼主你新建一个 php 文件,然后从本帖复制代码过去,如果不重复,那就说明你之前的代码里有隐藏字符,在你贴到本贴时,隐藏字符已经丢失了,所以我们其他人测试不会出现你这个问题。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/335582

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX