V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Jakesoft
V2EX  ›  PHP

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

  •  
  •   Jakesoft · 2017-07-24 12:00:51 +08:00 · 5965 次点击
    这是一个创建于 2687 天前的主题,其中的信息可能已经有所发展或是发生改变。

    注意这不是一个面试题,也别喷『谁写出这样代码拉出去枪毙 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 条回复    2017-07-29 17:00:49 +08:00
    Arrowing
        1
    Arrowing  
       2017-07-24 12:17:36 +08:00
    谷歌,好像没掉坑里吧? (捂脸。。。
    好久没碰 PHP 了,现在可以数组可以直接用[]了么?
    ety001
        2
    ety001  
       2017-07-24 12:20:26 +08:00
    360
    580a388da131
        3
    580a388da131  
       2017-07-24 12:20:40 +08:00
    @Arrowing 5.4 开始就可以了,现在都到 7 了
    gdtv
        4
    gdtv  
       2017-07-24 12:21:40 +08:00
    我测试了一下,返回的是“ 360 ”,求解释
    XiLiGe
        5
    XiLiGe  
       2017-07-24 12:27:27 +08:00
    360
    elvodn
        6
    elvodn  
       2017-07-24 12:29:18 +08:00
    strpos("$link", "$key")
    FYK
        7
    FYK  
       2017-07-24 12:30:45 +08:00
    strpos:( https://secure.php.net/manual/zh/function.strpos.php):

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

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

    可能是這樣?
    niuoh
        9
    niuoh  
       2017-07-24 12:33:20 +08:00
    strpos('h',360)!==false

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


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

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

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

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

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

    经过 foreach 后 key:
    int(8)
    string(3) "8.7"
    string(3) "0.6"
    90safe
        30
    90safe  
       2017-07-29 17:00:49 +08:00
    @qfdk 一眼望过去差点没反应过来,弱类型语言好坑
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2564 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 10:27 · PVG 18:27 · LAX 02:27 · JFK 05:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.