ioioioioioioi
V2EX  ›  PHP

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

  •  1
     
  •   ioioioioioioi · Jan 19, 2017 · 6621 views
    This topic created in 3584 days ago, the information mentioned may be changed or developed.
    $a['test'] = 'hi';
    $a['test'] = 'hello';
    
    得到的结果是
    [
        [test] => hi
        [test] => hello
    ]
    而我实际想要的是:
    [
        [test] => hello
    ]
    
    Supplement 1  ·  Jan 19, 2017

    大家感兴趣可以这样测试,我这边出现重复:

    $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

    Supplement 2  ·  Jan 19, 2017
    你们没有重复吗?
    Supplement 3  ·  Jan 19, 2017
    最终解决办法,给键值加 md5
    64 replies  •  2017-02-14 16:14:59 +08:00
    haiyang416
    haiyang416
    Jan 19, 2017 via Android
    1
    按理说这样的情况不可能出现,能不能贴一下完整的代码!
    haiyang416
    haiyang416
    Jan 19, 2017 via Android
    2
    感叹号应该是?
    haiyang416
    haiyang416
    Jan 19, 2017 via Android
    3
    特意在 PHP 7 测试了一遍,没有遇到你这样的问题。
    ioioioioioioi
    ioioioioioioi
    OP
    Jan 19, 2017
    4
    @haiyang416 嗯,我测试了,没有出现,但是确实有:
    [1111] => Array
    (
    [meta_description] => meta_description
    [meta_description] => blalbal
    )
    neilwong
    neilwong
    Jan 19, 2017
    5
    你逗呢?能测试好了再发帖么。
    skydiver
    skydiver
    Jan 19, 2017
    6
    请给出完整的可重现测试用例
    anewg
    anewg
    Jan 19, 2017
    7
    https://3v4l.org/8LZNd

    不懂楼主结果怎么弄出来的。。
    skydiver
    skydiver
    Jan 19, 2017
    8
    key 里面有不可见字符的话,也会有这种结果
    比如:

    $a = [];

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

    输出
    Array
    (
    [hell ⁠ o] => 1
    [hello] => 2
    )
    skydiver
    skydiver
    Jan 19, 2017
    9
    v2ex 自动排版了,输出是看不出空格的
    ioioioioioioi
    ioioioioioioi
    OP
    Jan 19, 2017
    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);
    }

    不知道为什么会出现这种情况。
    zi
    zi
    Jan 19, 2017
    11
    @ioioioioioioi 眼睛都看花了,这修改前后有区别吗。。
    explon
    explon
    Jan 19, 2017
    12
    小学生都会上网了
    ioioioioioioi
    ioioioioioioi
    OP
    Jan 19, 2017
    13
    @zi 确实没什么区别,但是确实修复了我提到的 bug ,也是困惑中。。。
    luziafy
    luziafy
    Jan 19, 2017
    14
    总想搞个大事情
    hheedat
    hheedat
    Jan 19, 2017❤️8
    15
    你可能安装了假 PHP
    shiny
    shiny
    Jan 19, 2017 via iPhone
    16
    这是想搞个大新闻啊,是不是什么隐藏字符在里面了。你要是代码能跑出来可以去官方报 bug 了
    Roope
    Roope
    Jan 19, 2017❤️1
    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
    ```

    无法复现
    ioioioioioioi
    ioioioioioioi
    OP
    Jan 19, 2017
    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
    )
    qiayue
    qiayue
    Jan 19, 2017
    19
    你用 array_keys 获取最后数组的键数组后,判断一下两个键是否相同
    qiayue
    qiayue
    Jan 19, 2017❤️1
    20
    楼主你新建一个 php 文件,然后从本帖复制代码过去,如果不重复,那就说明你之前的代码里有隐藏字符,在你贴到本贴时,隐藏字符已经丢失了,所以我们其他人测试不会出现你这个问题。
    zi
    zi
    Jan 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
    ioioioioioioi
    ioioioioioioi
    OP
    Jan 19, 2017
    22
    @Roope 晕了,我再去测测看,我的 PHP 有问题?
    HanSonJ
    HanSonJ
    Jan 19, 2017
    23
    @ioioioioioioi http://imgur.com/a/uqeGQ 你应该是用了假的编辑器和解析器解析了一个假的 PHP ,所以给了一个假的结果
    moult
    moult
    Jan 19, 2017
    24
    楼主在下面再来几句代码!我就不信 KEY 是一样的。老衲不信这个邪了。
    foreach($ret as $key=>$value){
    var_dump($key);
    var_dump(bin2hex($key));
    }
    lyragosa
    lyragosa
    Jan 19, 2017
    25
    楼主你这是要搞大新闻啊……
    ioioioioioioi
    ioioioioioioi
    OP
    Jan 19, 2017
    26
    @qiayue 新建文件测试确实没有重复了,可能如你所说,含有隐藏字符,这个是哥哥语言的翻译键值,或许是加其他语言翻译导致的,感谢,我再具体看看
    haiyang416
    haiyang416
    Jan 19, 2017 via Android
    27
    @ioioioioioioi 你可能装了假 PHP7 ,我测试本地后还专门去网上找各个 PHP sandbox 粘帖运行你给出的代码,结果全是:
    <pre>Array
    (
    [meta_description] => tom
    )
    </pre>

    没有复现,没办法。
    ioioioioioioi
    ioioioioioioi
    OP
    Jan 19, 2017
    28
    @haiyang416 嗯,感谢,那应该是隐藏字符吧。
    mko0okmko0
    mko0okmko0
    Jan 19, 2017
    29
    重复使用的 key 就用一个变数存起来吧.重复使用$k 的方式可避免手残输入了神奇的文字.
    kaneg
    kaneg
    Jan 19, 2017
    30
    或者是里面的字符看起来一样,其实不一样,我就被这两个坑过:[…] 和 [...]
    realpg
    realpg
    Jan 19, 2017
    31
    @ioioioioioioi
    报一下你的 PHP 版本, PHP 安装方式
    gouchaoer
    gouchaoer
    Jan 19, 2017 via Android
    32
    可能是 linux 下带了\r 之类的,你比较一下两个 key 肯定不一样,退一万步。。。 array 本质上是 hash , key 怎么可能相同
    bianhua
    bianhua
    Jan 19, 2017
    33
    楼主,建议你将出错的文件上传一下,这样大家可以帮你分析一下到底是怎么回事。
    void1900
    void1900
    Jan 19, 2017
    34
    哈哈哈 sublime 这些隐藏字符会标出来~ 安利一波
    shiny
    shiny
    Jan 19, 2017
    35
    @ioioioioioioi 我用 Docker 升级到 PHP7.1.0 来执行你的代码,并没有重现出你的结果。
    shiny
    shiny
    Jan 19, 2017
    36
    建议你用能显示隐藏字符的编辑器查看下你本地的源码。
    flyingghost
    flyingghost
    Jan 19, 2017
    37
    用 010editor 等 16 进制编辑器打开你的源码找找隐藏字符?
    youxiachai
    youxiachai
    Jan 19, 2017
    38
    不可见字符....
    ioioioioioioi
    ioioioioioioi
    OP
    Jan 19, 2017
    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
    )
    realpg
    realpg
    Jan 19, 2017 via Android
    40
    @ioioioioioioi 请将能复现的数组按照 24 楼输出一下
    bianhua
    bianhua
    Jan 19, 2017
    41
    @ioioioioioioi

    “估计”是不能真正解决问题的。你必须提供样本,问题不但无法准确定位,而且未来很有可能会在不经意的地方出现,比如那些效验用户输入的函数里。
    ioioioioioioi
    ioioioioioioi
    OP
    Jan 19, 2017
    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"
    ioioioioioioi
    ioioioioioioi
    OP
    Jan 19, 2017
    43
    @realpg
    @bianhua 这是所有的 meta_description 键值
    bianhua
    bianhua
    Jan 19, 2017
    44
    @ioioioioioioi

    那么这个问题很明显就不是“不可见字符”的问题了。

    你还是准备一个最小可复现的样本然后压缩好上传到能公开下载的地方吧。只有看了文件才能进一步排查问题。
    xbonline
    xbonline
    Jan 19, 2017
    45
    也有可能是启用了啥 PHP 扩展造成的
    iyaozhen
    iyaozhen
    Jan 19, 2017 via Android
    46
    同意楼上,估计是什么扩展
    ioioioioioioi
    ioioioioioioi
    OP
    Jan 19, 2017
    47
    @bianhua 其他翻译也出现问了,键值也是 meta 开头 meta_description_detail , 测试了其他重复键值的,确并没用这样的错误。给键值加了 md5 后不再重复。
    ioioioioioioi
    ioioioioioioi
    OP
    Jan 19, 2017
    48
    @xbonline
    @iyaozhen 但是加 md5 作为键值,不再出现重复的情况,啥情况?
    yangqi
    yangqi
    Jan 19, 2017
    49
    应该是环境配置问题,贴 php -v, php -m
    ioioioioioioi
    ioioioioioioi
    OP
    Jan 19, 2017
    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
    Monstercat
    Monstercat
    Jan 19, 2017
    51
    第一反应就是不可见字符。。然而 42 楼开始事情变得有趣了起来😭关注一下
    via
    via
    Jan 19, 2017
    53
    楼主激动得连标题中的错别字都不顾了
    ioioioioioioi
    ioioioioioioi
    OP
    Jan 20, 2017
    54
    @yangqi 哈,高人,果然是 Opcache 的原因。竟然中招了,花了几乎一天时间就为了解决这个问题。不知道什么时候会修复。
    quericy
    quericy
    Jan 20, 2017
    55
    刚点进这个帖子的时候我是不信的....涨姿势了
    frozenshadow
    frozenshadow
    Jan 20, 2017
    56
    昨天等到现在,终于有答案了
    hoythan
    hoythan
    PRO
    Jan 20, 2017
    57
    这属于严重 BUG 了吧!
    8355
    8355
    Jan 20, 2017
    58
    @yangqi 6666666666
    bianhua
    bianhua
    Jan 20, 2017
    59
    @ioioioioioioi

    你试试看禁用你的 OPCache ,看看问题是不是消失了。
    ioioioioioioi
    ioioioioioioi
    OP
    Jan 20, 2017
    60
    @bianhua 看 bug 描述,应该就是 opcache 导致的,我用循环生成数组,且键值加 md5 解决了。
    jfcherng
    jfcherng
    Jan 20, 2017
    61
    看 bug report 裡寫的 7.1.1 應該已經修復了?
    bianhua
    bianhua
    Jan 20, 2017
    62
    @ioioioioioioi

    你 54 楼表示“果然是 Opcache 的原因”,但在 60 楼却表示“ bug 描述,*应该*就是 opcache 导致的”。

    如果有人告诉你是因为天冷机器着凉导致的你会不会也就相信了?
    mingyun
    mingyun
    Jan 21, 2017
    63
    还以为楼主想搞大新闻呢, 涨姿势了
    aksoft
    aksoft
    Feb 14, 2017
    64
    ...不用 op
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   3597 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 96ms · UTC 01:01 · PVG 09:01 · LAX 17:01 · JFK 20:01
    ♥ Do have faith in what you're doing.