$a['test'] = 'hi';
$a['test'] = 'hello';
得到的结果是
[
[test] => hi
[test] => hello
]
而我实际想要的是:
[
[test] => hello
]
$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
|
haiyang416Jan 19, 2017 via Android
1
按理说这样的情况不可能出现,能不能贴一下完整的代码!
|
|
haiyang416Jan 19, 2017 via Android
2
感叹号应该是?
|
|
haiyang416Jan 19, 2017 via Android
3
特意在 PHP 7 测试了一遍,没有遇到你这样的问题。
|
|
4
@haiyang416 嗯,我测试了,没有出现,但是确实有:
[1111] => Array ( [meta_description] => meta_description [meta_description] => blalbal ) |
|
neilwongJan 19, 2017
5
你逗呢?能测试好了再发帖么。
|
|
skydiverJan 19, 2017
6
请给出完整的可重现测试用例
|
|
anewgJan 19, 2017
7
|
|
skydiverJan 19, 2017
8
key 里面有不可见字符的话,也会有这种结果
比如: $a = []; $a["hell\u{2060}o"] = 1; $a["hello"] = 2; print_r($a); 输出 Array ( [hell o] => 1 [hello] => 2 ) |
|
skydiverJan 19, 2017
9
v2ex 自动排版了,输出是看不出空格的
|
|
10
@skydiver
@anewg @skydiver @neilwong @haiyang416 问题解决了,本来的代码是这样的: $ret = array_combine($keys, $keys); 后面会对$ret 赋值(键值重复), 这样修改后没有重复的问题了: $ret = $this->combineArr($keys); protected function combineArr($arr) { return array_combine($arr, $arr); } 不知道为什么会出现这种情况。 |
|
ziJan 19, 2017
11
@ioioioioioioi 眼睛都看花了,这修改前后有区别吗。。
|
|
explonJan 19, 2017
12
小学生都会上网了
|
|
13
@zi 确实没什么区别,但是确实修复了我提到的 bug ,也是困惑中。。。
|
|
luziafyJan 19, 2017
14
总想搞个大事情
|
|
15
你可能安装了假 PHP
|
|
shinyJan 19, 2017 via iPhone
16
这是想搞个大新闻啊,是不是什么隐藏字符在里面了。你要是代码能跑出来可以去官方报 bug 了
|
|
17
```
~ # 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
@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 ) |
|
qiayueJan 19, 2017
19
你用 array_keys 获取最后数组的键数组后,判断一下两个键是否相同
|
|
20
楼主你新建一个 php 文件,然后从本帖复制代码过去,如果不重复,那就说明你之前的代码里有隐藏字符,在你贴到本贴时,隐藏字符已经丢失了,所以我们其他人测试不会出现你这个问题。
|
|
ziJan 19, 2017
21
@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
@Roope 晕了,我再去测测看,我的 PHP 有问题?
|
|
HanSonJJan 19, 2017
23
@ioioioioioioi http://imgur.com/a/uqeGQ 你应该是用了假的编辑器和解析器解析了一个假的 PHP ,所以给了一个假的结果
|
|
moultJan 19, 2017
24
楼主在下面再来几句代码!我就不信 KEY 是一样的。老衲不信这个邪了。
foreach($ret as $key=>$value){ var_dump($key); var_dump(bin2hex($key)); } |
|
lyragosaJan 19, 2017
25
楼主你这是要搞大新闻啊……
|
|
26
@qiayue 新建文件测试确实没有重复了,可能如你所说,含有隐藏字符,这个是哥哥语言的翻译键值,或许是加其他语言翻译导致的,感谢,我再具体看看
|
|
haiyang416Jan 19, 2017 via Android
27
@ioioioioioioi 你可能装了假 PHP7 ,我测试本地后还专门去网上找各个 PHP sandbox 粘帖运行你给出的代码,结果全是:
<pre>Array ( [meta_description] => tom ) </pre> 没有复现,没办法。 |
|
28
@haiyang416 嗯,感谢,那应该是隐藏字符吧。
|
|
mko0okmko0Jan 19, 2017
29
重复使用的 key 就用一个变数存起来吧.重复使用$k 的方式可避免手残输入了神奇的文字.
|
|
kanegJan 19, 2017
30
或者是里面的字符看起来一样,其实不一样,我就被这两个坑过:[…] 和 [...]
|
|
realpgJan 19, 2017
31
@ioioioioioioi
报一下你的 PHP 版本, PHP 安装方式 |
|
gouchaoerJan 19, 2017 via Android
32
可能是 linux 下带了\r 之类的,你比较一下两个 key 肯定不一样,退一万步。。。 array 本质上是 hash , key 怎么可能相同
|
|
bianhuaJan 19, 2017
33
楼主,建议你将出错的文件上传一下,这样大家可以帮你分析一下到底是怎么回事。
|
|
void1900Jan 19, 2017
34
哈哈哈 sublime 这些隐藏字符会标出来~ 安利一波
|
|
shinyJan 19, 2017
35
@ioioioioioioi 我用 Docker 升级到 PHP7.1.0 来执行你的代码,并没有重现出你的结果。
|
|
shinyJan 19, 2017
36
建议你用能显示隐藏字符的编辑器查看下你本地的源码。
|
|
flyingghostJan 19, 2017
37
用 010editor 等 16 进制编辑器打开你的源码找找隐藏字符?
|
|
youxiachaiJan 19, 2017
38
不可见字符....
|
|
39
@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 ) |
|
realpgJan 19, 2017 via Android
40
@ioioioioioioi 请将能复现的数组按照 24 楼输出一下
|
|
bianhuaJan 19, 2017
41
|
|
42
@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
|
|
bianhuaJan 19, 2017
44
|
|
xbonlineJan 19, 2017
45
也有可能是启用了啥 PHP 扩展造成的
|
|
iyaozhenJan 19, 2017 via Android
46
同意楼上,估计是什么扩展
|
|
47
@bianhua 其他翻译也出现问了,键值也是 meta 开头 meta_description_detail , 测试了其他重复键值的,确并没用这样的错误。给键值加了 md5 后不再重复。
|
|
48
|
|
yangqiJan 19, 2017
49
应该是环境配置问题,贴 php -v, php -m
|
|
50
@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 |
|
MonstercatJan 19, 2017
51
第一反应就是不可见字符。。然而 42 楼开始事情变得有趣了起来😭关注一下
|
|
52
|
|
viaJan 19, 2017
53
楼主激动得连标题中的错别字都不顾了
|
|
54
@yangqi 哈,高人,果然是 Opcache 的原因。竟然中招了,花了几乎一天时间就为了解决这个问题。不知道什么时候会修复。
|
|
quericyJan 20, 2017
55
刚点进这个帖子的时候我是不信的....涨姿势了
|
|
frozenshadowJan 20, 2017
56
昨天等到现在,终于有答案了
|
|
57
这属于严重 BUG 了吧!
|
|
bianhuaJan 20, 2017
59
|
|
60
@bianhua 看 bug 描述,应该就是 opcache 导致的,我用循环生成数组,且键值加 md5 解决了。
|
|
jfcherngJan 20, 2017
61
看 bug report 裡寫的 7.1.1 應該已經修復了?
|
|
bianhuaJan 20, 2017
62
@ioioioioioioi
你 54 楼表示“果然是 Opcache 的原因”,但在 60 楼却表示“ bug 描述,*应该*就是 opcache 导致的”。 如果有人告诉你是因为天冷机器着凉导致的你会不会也就相信了? |
|
mingyunJan 21, 2017
63
还以为楼主想搞大新闻呢, 涨姿势了
|
|
aksoftFeb 14, 2017
64
...不用 op
|