Jakesoft
V2EX  ›  PHP

时至如今,我还是要你们回答这个问题

  •  
  •   Jakesoft · Jul 24, 2017 · 7328 views
    This topic created in 3392 days ago, the information mentioned may be changed or developed.

    注意这不是一个面试题,也别喷『谁写出这样代码拉出去枪毙 5 分钟』,顺便说一句,我确实写过这样的代码...

    <?php
    function getReferer($link)
    {
        $refMap = [
            'baidu' => '百度',
            'sougou' => '搜狗',
            '360' => '360',
            'google' => '谷歌'
        ];
        foreach ($refMap as $key => $value) {
            if (strpos($link, $key) !== false) {
                return $value;
            }
        }
        return '其他';
    }
    echo getReferer('https://www.google.com/search?workd=%FD%##%#%E%D%D%D%D%D%D%');
    

    so, what's the output?

    30 replies  •  2017-07-29 17:00:49 +08:00
    Arrowing
    Arrowing
    Jul 24, 2017
    1
    谷歌,好像没掉坑里吧? (捂脸。。。
    好久没碰 PHP 了,现在可以数组可以直接用[]了么?
    ety001
    ety001
    Jul 24, 2017
    2
    360
    580a388da131
    580a388da131
    Jul 24, 2017
    3
    @Arrowing 5.4 开始就可以了,现在都到 7 了
    gdtv
    gdtv
    Jul 24, 2017
    4
    我测试了一下,返回的是“ 360 ”,求解释
    XiLiGe
    XiLiGe
    Jul 24, 2017
    5
    360
    elvodn
    elvodn
    Jul 24, 2017
    6
    strpos("$link", "$key")
    FYK
    FYK
    Jul 24, 2017
    7
    strpos:( https://secure.php.net/manual/zh/function.strpos.php):

    mixed strpos ( string $haystack , mixed $needle [, int $offset = 0 ] )

    如果 needle 不是一个字符串,那么它将被转换为整型并被视为字符的顺序值。
    jfcherng
    jfcherng
    Jul 24, 2017❤️1
    8
    $key 裡的 '360' 被當成了 int 解釋,於是成了 `if (strpos('h...', 360) !== false)`
    而 360 轉成 ascii char,360%128 = 104 = 'h',於是 `strpos('h...', 360)` 返回 0

    可能是這樣?
    niuoh
    niuoh
    Jul 24, 2017
    9
    strpos('h',360)!==false

    strpos 函数 第二个参数为整数时自动转成 ascii 码 360 大于 256 个 ascii 码总数 所以把他减去 256 的 360-256=104
    chr(104)='h'
    yalanaika
    yalanaika
    Jul 24, 2017
    10
    弱类型在这里真的太可怕了
    solaro
    solaro
    Jul 24, 2017
    11
    哎呦,有点意思
    mooncakejs
    mooncakejs
    Jul 24, 2017 via iPhone
    12
    这这个陨石坑啊
    reus
    reus
    Jul 24, 2017
    13
    PHP 是世界上最垃圾的语言
    0x0
    0x0
    Jul 24, 2017❤️1
    14
    CTF 又有新素材了…
    levn
    levn
    Jul 24, 2017❤️1
    15
    是数组键值的类型转换不是 strpos 吧。

    “
    key 可以是 integer 或者 string。value 可以是任意类型。

    此外 key 会有如下的强制转换:

    包含有合法整型值的字符串会被转换为整型。例如键名 "8" 实际会被储存为 8。但是 "08" 则不会强制转换,因为其不是一个合法的十进制数值。
    浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8。
    布尔值也会被转换成整型。即键名 true 实际会被储存为 1 而键名 false 会被储存为 0。
    Null 会被转换为空字符串,即键名 null 实际会被储存为 ""。
    数组和对象不能被用为键名。坚持这么做会导致警告:Illegal offset type。
    ”
    Takahashi
    Takahashi
    Jul 24, 2017
    16
    strpos()和 strstr()是一回事吗
    sagaxu
    sagaxu
    Jul 24, 2017
    17
    list/map 不分是个坑,动态类型是个巨坑,弱类型是个天坑。最好的语言,门槛很低,坑很深
    fork3rt
    fork3rt
    Jul 24, 2017❤️1
    18
    强制转一下类型就好了。

    if (strpos($link, strval($key)) !== false) {
    return $value;
    }
    nfroot
    nfroot
    Jul 24, 2017
    19
    居然坑这么大 吓死人!
    RLib
    RLib
    Jul 24, 2017
    20
    @Takahashi
    返回值不同而已, 查找一致

    除了楼上的坑, 再补个, 是否应该考虑 stripos
    quericy
    quericy
    Jul 24, 2017❤️1
    21
    就算不踩坑,逻辑还是有问题
    getReferer('https://www.google.com/#q=baidu');
    RLib
    RLib
    Jul 24, 2017
    22
    @quericy 这个没问题, 识别的是谷歌
    RLib
    RLib
    Jul 24, 2017
    23
    哦, 有问题
    joeke
    joeke
    Jul 24, 2017❤️1
    24
    弱类型很可怕啊,这种问题 还很难找出来的,坑了
    zjsxwc
    zjsxwc
    Jul 24, 2017
    25
    使用 mb 系列的字符串操作,试试 mb_strpos
    leafx
    leafx
    Jul 24, 2017
    26
    好吧,我承认我应该被拉出枪毙 5 分钟,
    imbin
    imbin
    Jul 24, 2017
    27
    好吧 我也一下子没看出坑的位置
    chahualao
    chahualao
    Jul 25, 2017
    28
    我不适合当程序员
    chahualao
    chahualao
    Jul 25, 2017
    29
    @levn
    $arr = [
    '8'=>'八',
    '8.7'=>'八点七',
    '0.6'=>'零点六',
    ];

    经过 foreach 后 key:
    int(8)
    string(3) "8.7"
    string(3) "0.6"
    90safe
    90safe
    Jul 29, 2017
    30
    @qfdk 一眼望过去差点没反应过来,弱类型语言好坑
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   3641 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 68ms · UTC 05:18 · PVG 13:18 · LAX 21:18 · JFK 00:18
    ♥ Do have faith in what you're doing.