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