时至如今,我还是要你们回答这个问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Jakesoft
V2EX    PHP

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

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

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

    <?php function getReferer($link) { $refMap = [ 'baidu' => '百度', 'sougou' => '搜狗', '360' => '360', 'google' => '谷歌' ]; foreach ($refap 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 $ofset = 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"
    strig(3) "0.6"
    90safe
        30
    90safe  
       2017-07-29 17:00:49 +08:00
    @qfdk 一眼望过去差点没反应过来,弱类型语言好坑
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3058 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 59ms UTC 12:44 PVG 20:44 LAX 05:44 JFK 08:44
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86