注意这不是一个面试题,也别喷『谁写出这样代码拉出去枪毙 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?
![]() | 1 Arrowing 2017-07-24 12:17:36 +08:00 谷歌,好像没掉坑里吧? (捂脸。。。 好久没碰 PHP 了,现在可以数组可以直接用[]了么? |
![]() | 2 ety001 2017-07-24 12:20:26 +08:00 360 |
![]() | 3 580a388da131 2017-07-24 12:20:40 +08:00 @Arrowing 5.4 开始就可以了,现在都到 7 了 |
4 gdtv 2017-07-24 12:21:40 +08:00 我测试了一下,返回的是“ 360 ”,求解释 |
![]() | 5 XiLiGe 2017-07-24 12:27:27 +08:00 360 |
6 elvodn 2017-07-24 12:29:18 +08:00 strpos("$link", "$key") |
![]() | 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 不是一个字符串,那么它将被转换为整型并被视为字符的顺序值。 |
![]() | 8 jfcherng 2017-07-24 12:31:52 +08:00 ![]() $key 的 '360' 被成了 int 解,於是成了 `if (strpos('h...', 360) !== false)` 而 360 成 ascii char,360%128 = 104 = 'h',於是 `strpos('h...', 360)` 返回 0 可能是? |
![]() | 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' |
10 yalanaika 2017-07-24 12:45:10 +08:00 弱类型在这里真的太可怕了 |
![]() | 11 solaro 2017-07-24 12:49:20 +08:00 哎呦,有点意思 |
12 mooncakejs 2017-07-24 12:51:05 +08:00 via iPhone 这这个陨石坑啊 |
![]() | 13 reus 2017-07-24 12:57:18 +08:00 PHP 是世界上最垃圾的语言 |
![]() | 14 0x0 2017-07-24 13:01:00 +08:00 ![]() CTF 又有新素材了… |
![]() | 15 levn 2017-07-24 13:04:51 +08:00 ![]() 是数组键值的类型转换不是 strpos 吧。 “ key 可以是 integer 或者 string。value 可以是任意类型。 此外 key 会有如下的强制转换: 包含有合法整型值的字符串会被转换为整型。例如键名 "8" 实际会被储存为 8。但是 "08" 则不会强制转换,因为其不是一个合法的十进制数值。 浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8。 布尔值也会被转换成整型。即键名 true 实际会被储存为 1 而键名 false 会被储存为 0。 Null 会被转换为空字符串,即键名 null 实际会被储存为 ""。 数组和对象不能被用为键名。坚持这么做会导致警告:Illegal offset type。 ” |
![]() | 16 Takahashi 2017-07-24 13:11:43 +08:00 strpos()和 strstr()是一回事吗 |
![]() | 17 sagaxu 2017-07-24 14:00:39 +08:00 list/map 不分是个坑,动态类型是个巨坑,弱类型是个天坑。最好的语言,门槛很低,坑很深 |
18 fork3rt 2017-07-24 14:05:12 +08:00 ![]() 强制转一下类型就好了。 if (strpos($link, strval($key)) !== false) { return $value; } |
![]() | 19 nfroot 2017-07-24 14:28:28 +08:00 居然坑这么大 吓死人! |
21 quericy 2017-07-24 14:48:09 +08:00 ![]() 就算不踩坑,逻辑还是有问题 getReferer('https://www.google.com/#q=baidu'); |
![]() | 23 RLib 2017-07-24 15:22:08 +08:00 哦, 有问题 |
![]() | 24 joeke 2017-07-24 15:29:43 +08:00 ![]() 弱类型很可怕啊,这种问题 还很难找出来的,坑了 |
![]() | 25 zjsxwc 2017-07-24 15:52:15 +08:00 使用 mb 系列的字符串操作,试试 mb_strpos |
![]() | 26 leafx 2017-07-24 16:34:30 +08:00 好吧,我承认我应该被拉出枪毙 5 分钟, |
![]() | 27 imbin 2017-07-24 22:54:23 +08:00 好吧 我也一下子没看出坑的位置 |
28 chahualao 2017-07-25 17:23:58 +08:00 我不适合当程序员 |