
$a['test'] = 'hi'; $a['test'] = 'hello'; 得到的结果是 [ [test] => hi [test] => hello ] 而我实际想要的是: [ [test] => hello ] 大家感兴趣可以这样测试,我这边出现重复:
$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 ) @haiyang416 @neilwong @skydiver @skydiver @zi
1 haiyang416 2017 年 1 月 19 日 via Android 按理说这样的情况不可能出现,能不能贴一下完整的代码! |
2 haiyang416 2017 年 1 月 19 日 via Android 感叹号应该是? |
3 haiyang416 2017 年 1 月 19 日 via Android 特意在 PHP 7 测试了一遍,没有遇到你这样的问题。 |
4 ioioioioioioi OP @haiyang416 嗯,我测试了,没有出现,但是确实有: [1111] => Array ( [meta_description] => meta_description [meta_description] => blalbal ) |
5 neilwong 2017 年 1 月 19 日 你逗呢?能测试好了再发帖么。 |
6 skydiver 2017 年 1 月 19 日 请给出完整的可重现测试用例 |
7 anewg 2017 年 1 月 19 日 |
8 skydiver 2017 年 1 月 19 日 key 里面有不可见字符的话,也会有这种结果 比如: $a = []; $a["hell\u{2060}o"] = 1; $a["hello"] = 2; print_r($a); 输出 Array ( [hell o] => 1 [hello] => 2 ) |
9 skydiver 2017 年 1 月 19 日 v2ex 自动排版了,输出是看不出空格的 |
10 ioioioioioioi OP @skydiver @anewg @skydiver @neilwong @haiyang416 问题解决了,本来的代码是这样的: $ret = array_combine($keys, $keys); 后面会对$ret 赋值(键值重复), 这样修改后没有重复的问题了: $ret = $this->combineArr($keys); protected function combineArr($arr) { return array_combine($arr, $arr); } 不知道为什么会出现这种情况。 |
11 zi 2017 年 1 月 19 日 @ioioioioioioi 眼睛都看花了,这修改前后有区别吗。。 |
12 explon 2017 年 1 月 19 日 小学生都会上网了 |
13 ioioioioioioi OP @zi 确实没什么区别,但是确实修复了我提到的 bug ,也是困惑中。。。 |
14 luziafy 2017 年 1 月 19 日 总想搞个大事情 |
15 hheedat 2017 年 1 月 19 日 你可能安装了假 PHP |
16 shiny PRO 这是想搞个大新闻啊,是不是什么隐藏字符在里面了。你要是代码能跑出来可以去官方报 bug 了 |
17 Roope 2017 年 1 月 19 日 ``` ~ # 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 ``` 无法复现 |
18 ioioioioioioi OP @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 ) |
19 qiayue PRO 你用 array_keys 获取最后数组的键数组后,判断一下两个键是否相同 |
20 qiayue PRO 楼主你新建一个 php 文件,然后从本帖复制代码过去,如果不重复,那就说明你之前的代码里有隐藏字符,在你贴到本贴时,隐藏字符已经丢失了,所以我们其他人测试不会出现你这个问题。 |
21 zi 2017 年 1 月 19 日 @ioioioioioioi 我也无法复现 ~# php test.php <pre>Array ( [meta_description] => tom ) </pre> ~# php -v PHP 7.1.0 (cli) (built: Dec 2 2016 15:44:02) ( NTS ) Copyright (c) 1997-2016 The PHP Group Zend Engine v3.1.0-dev, Copyright (c) 1998-2016 Zend Technologies |
22 ioioioioioioi OP @Roope 晕了,我再去测测看,我的 PHP 有问题? |
23 HanSonJ 2017 年 1 月 19 日 @ioioioioioioi http://imgur.com/a/uqeGQ 你应该是用了假的编辑器和解析器解析了一个假的 PHP ,所以给了一个假的结果 |
24 moult 2017 年 1 月 19 日 楼主在下面再来几句代码!我就不信 KEY 是一样的。老衲不信这个邪了。 foreach($ret as $key=>$value){ var_dump($key); var_dump(bin2hex($key)); } |
25 lyragosa 2017 年 1 月 19 日 楼主你这是要搞大新闻啊…… |
26 ioioioioioioi OP @qiayue 新建文件测试确实没有重复了,可能如你所说,含有隐藏字符,这个是哥哥语言的翻译键值,或许是加其他语言翻译导致的,感谢,我再具体看看 |
27 haiyang416 2017 年 1 月 19 日 via Android @ioioioioioioi 你可能装了假 PHP7 ,我测试本地后还专门去网上找各个 PHP sandbox 粘帖运行你给出的代码,结果全是: <pre>Array ( [meta_description] => tom ) </pre> 没有复现,没办法。 |
28 ioioioioioioi OP @haiyang416 嗯,感谢,那应该是隐藏字符吧。 |
29 mko0okmko0 2017 年 1 月 19 日 重复使用的 key 就用一个变数存起来吧.重复使用$k 的方式可避免手残输入了神奇的文字. |
30 kaneg 2017 年 1 月 19 日 或者是里面的字符看起来一样,其实不一样,我就被这两个坑过:[…] 和 [...] |
31 realpg PRO @ioioioioioioi 报一下你的 PHP 版本, PHP 安装方式 |
32 gouchaoer 2017 年 1 月 19 日 via Android 可能是 linux 下带了\r 之类的,你比较一下两个 key 肯定不一样,退一万步。。。 array 本质上是 hash , key 怎么可能相同 |
33 bianhua 2017 年 1 月 19 日 楼主,建议你将出错的文件上传一下,这样大家可以帮你分析一下到底是怎么回事。 |
34 void1900 2017 年 1 月 19 日 哈哈哈 sublime 这些隐藏字符会标出来~ 安利一波 |
35 shiny PRO @ioioioioioioi 我用 Docker 升级到 PHP7.1.0 来执行你的代码,并没有重现出你的结果。 |
36 shiny PRO 建议你用能显示隐藏字符的编辑器查看下你本地的源码。 |
37 flyingghost 2017 年 1 月 19 日 用 010editor 等 16 进制编辑器打开你的源码找找隐藏字符? |
38 youxiachai 2017 年 1 月 19 日 不可见字符.... |
39 ioioioioioioi OP @mko0okmko0 @kaneg @realpg @gouchaoer @bianhua @void1900 @shiny @flyingghost 系统是 ubuntu16.04 , php7 ,法国源 meta_description 是内部用户输入的键值,是各个翻译语言的键值,我上面贴出的结果,确实是我测试代码出的结果,但是后来 comment/uncomment 后测试又没有了,但是正式的代码,还是有重复的键值。哎,也不折腾了,通过对 meta_description 做特别处理解决了,不信还有第二个键值重复。能解释通的估计就是内部用户输入的键值 meta_description 含有隐藏字符了。 Array ( [meta_description] => meta_description [meta_description] => tom ) |
40 realpg PRO @ioioioioioioi 请将能复现的数组按照 24 楼输出一下 |
41 bianhua 2017 年 1 月 19 日 |
42 ioioioioioioi OP @realpg @bianhua string(16) "meta_description" string(32) "6d6574615f6465736372697074696f6e" string(16) "meta_description" string(32) "6d6574615f6465736372697074696f6e" string(16) "meta_description" string(32) "6d6574615f6465736372697074696f6e" string(16) "meta_description" string(32) "6d6574615f6465736372697074696f6e" string(16) "meta_description" string(32) "6d6574615f6465736372697074696f6e" string(16) "meta_description" string(32) "6d6574615f6465736372697074696f6e" string(16) "meta_description" string(32) "6d6574615f6465736372697074696f6e" string(16) "meta_description" string(32) "6d6574615f6465736372697074696f6e" string(16) "meta_description" string(32) "6d6574615f6465736372697074696f6e" string(16) "meta_description" string(32) "6d6574615f6465736372697074696f6e" string(16) "meta_description" string(32) "6d6574615f6465736372697074696f6e" string(16) "meta_description" string(32) "6d6574615f6465736372697074696f6e" string(16) "meta_description" string(32) "6d6574615f6465736372697074696f6e" string(16) "meta_description" string(32) "6d6574615f6465736372697074696f6e" string(16) "meta_description" string(32) "6d6574615f6465736372697074696f6e" string(16) "meta_description" string(32) "6d6574615f6465736372697074696f6e" string(16) "meta_description" string(32) "6d6574615f6465736372697074696f6e" |
43 ioioioioioioi OP |
44 bianhua 2017 年 1 月 19 日 |
45 xbonline 2017 年 1 月 19 日 也有可能是启用了啥 PHP 扩展造成的 |
46 iyaozhen 2017 年 1 月 19 日 via Android 同意楼上,估计是什么扩展 |
47 ioioioioioioi OP @bianhua 其他翻译也出现问了,键值也是 meta 开头 meta_description_detail , 测试了其他重复键值的,确并没用这样的错误。给键值加了 md5 后不再重复。 |
48 ioioioioioioi OP |
49 yangqi 2017 年 1 月 19 日 应该是环境配置问题,贴 php -v, php -m |
50 ioioioioioioi OP @yangqi PHP 7.1.0-5+deb.sury.org~xenial+1 (cli) ( 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-5+deb.sury.org~xenial+1, Copyright (c) 1999-2016, by Zend Technologies [PHP Modules] calendar Core ctype curl date dom exif fileinfo filter ftp gd gettext hash iconv igbinary json libxml mbstring mcrypt memcached msgpack mysqli mysqlnd OAuth openssl pcntl pcre PDO pdo_mysql Phar posix readline Reflection session shmop SimpleXML sockets SPL standard sysvmsg sysvsem sysvshm tokenizer wddx xml xmlreader xmlwriter xsl Zend OPcache zip zlib [Zend Modules] Zend OPcache |
51 Monstercat 2017 年 1 月 19 日 第一反应就是不可见字符。。然而 42 楼开始事情变得有趣了起来关注一下 |
52 yangqi 2017 年 1 月 19 日 |
53 via 2017 年 1 月 19 日 楼主激动得连标题中的错别字都不顾了 |
54 ioioioioioioi OP @yangqi 哈,高人,果然是 Opcache 的原因。竟然中招了,花了几乎一天时间就为了解决这个问题。不知道什么时候会修复。 |
55 quericy 2017 年 1 月 20 日 刚点进这个帖子的时候我是不信的....涨姿势了 |
56 frozenshadow 2017 年 1 月 20 日 昨天等到现在,终于有答案了 |
57 hoythan 2017 年 1 月 20 日 这属于严重 BUG 了吧! |
59 bianhua 2017 年 1 月 20 日 |
60 ioioioioioioi OP @bianhua 看 bug 描述,应该就是 opcache 导致的,我用循环生成数组,且键值加 md5 解决了。 |
61 jfcherng 2017 年 1 月 20 日 看 bug report 的 7.1.1 已修了? |
62 bianhua 2017 年 1 月 20 日 @ioioioioioioi 你 54 楼表示“果然是 Opcache 的原因”,但在 60 楼却表示“ bug 描述,*应该*就是 opcache 导致的”。 如果有人告诉你是因为天冷机器着凉导致的你会不会也就相信了? |
63 mingyun 2017 年 1 月 21 日 还以为楼主想搞大新闻呢, 涨姿势了 |
64 aksoft 2017 年 2 月 14 日 ...不用 op |