因为PHP是弱类型语言,常常会发生许多意想不到的问题,所以,我们再次一一细数这些我们踏过的坑!!!

1)

foreach中自动回将key为数值的转化成整型,造成无法匹配

  1. function translate($keyword)
  2. {
  3. $trMap = [
  4. 'google' => '谷歌',
  5. '' => '',
  6. ];
  7. foreach ($trMap as $key => $value) {
  8. if (strpos($keyword, $key) !== false) {
  9. return $value;
  10. }
  11. }
  12.  
  13. return '其他';
  14. }
  15.  
  16. echo translate("google") . PHP_EOL;
  17. echo translate('') . PHP_EOL;
  18.  
  19. 结果:
  20. //谷歌
  21. //其他

修复bug:

  1. function translate($keyword)
  2. {
  3. $trMap = [
  4. 'google' => '谷歌',
  5. '' => '',
  6. ];
  7. foreach ($trMap as $key => $value) {
  8. if (strpos($keyword, (string)$key) !== false) {
  9. return $value;
  10. }
  11. }
  12.  
  13. return '其他';
  14. }
  15.  
  16. echo translate("google") . PHP_EOL;
  17. echo translate('') . PHP_EOL;
  18.  
  19. 结果:
  20. //谷歌
  21. //

建议: 如果确定变量的类型,一定要严格转化之后 ,再进行操作

2)注意array_merge 与 + 的区别使用

  1. $arr1 = ['a' => , 'b' => ];
  2. $arr2 = ['b' => , 'd' => ];
  3.  
  4. // 以 key 的前值为准
  5. var_dump($arr1 + $arr2);
  6. array (
  7. 'a' => 1,
  8. 'b' => 2, // b 为前值的值
  9. 'd' => 4,
  10. )
  11.  
  12. // 以 key 的后值为准
  13. var_dump(array_merge($arr1, $arr2));
  14. array (
  15. 'a' => 1,
  16. 'b' => 3, // b 为后值的值
  17. 'd' => 4,
  18. )
  19.  
  20. $arr3 = [, ];
  21. $arr4 = [, , ];
  22.  
  23. // 可以看到 + 依然会对索引数组的 key 起作用
  24. // 即 $arr3 的 key 0 key 1 会覆盖 $arr4 的 key 0 key 1
  25. // 所以得到的数组只有 3 个值
  26. var_export($arr3 + $arr4);
  27. array (
  28. 0 => 1,
  29. 1 => 2,
  30. 2 => 5,
  31. )
  32.  
  33. // array_merge 则会忽略索引素组的下标重复的问题,完全拼接
  34. var_export(array_merge($arr3, $arr4));
  35. array (
  36. 0 => 1,
  37. 1 => 2,
  38. 2 => 3,
  39. 3 => 4,
  40. 4 => 5,
  41. )

关于PHP的那些坑的更多相关文章

  1. 如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑

    阅读目录 前言 场景1的思考 场景2的思考 避坑方式 实践 结语 一.前言 在上一篇中(如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成),有一行注释的代码: public interfa ...

  2. 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例

    前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...

  3. Spark踩坑记——Spark Streaming+Kafka

    [TOC] 前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark strea ...

  4. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

  5. 踩石行动:ViewPager无限轮播的坑

    2016-6-19 前言 View轮播效果在app中很常见,一想到左右滑动的效果就很容易想到使用ViewPager来实现.对于像我们常说的banner这样的效果,具备无限滑动的功能是可以用ViewPa ...

  6. 为C# as 类型转换及Assembly.LoadFrom埋坑!

    背景: 不久前,我发布了一个调试工具:发布:.NET开发人员必备的可视化调试工具(你值的拥有) 效果是这样的: 之后,有小部分用户反映,工具用不了(没反应或有异常)~~~ 然后,建议小部分用户换个电脑 ...

  7. 首个threejs项目-前端填坑指南

    第一次使用threejs到实际项目中,开始的时候心情有点小激动,毕竟是第一次嘛,然而做着做着就感受到这玩意水好深,满满的都是坑,填都填不过来.经过老板20天惨无人道的摧残,终于小有成就. 因为第一次搞 ...

  8. dll文件32位64位检测工具以及Windows文件夹SysWow64的坑

    自从操作系统升级到64位以后,就要不断的需要面对32位.64位的问题.相信有很多人并不是很清楚32位程序与64位程序的区别,以及Program Files (x86),Program Files的区别 ...

  9. 关于微软HttpClient使用,避免踩坑

    最近公司对于WebApi的场景使用也越来越加大了,随之而来就是Api的客户端工具我们使用哪个?我们最常用的估计就是HttpClient,在微软类库中命名空间地址:System.Net.Http,是一个 ...

  10. iOS审核这些坑,腾讯游戏也踩过

    作者:Jamie,专项技术测试工程师,在iOS预审和ASO优化领域从事专项测试相关工作,为腾讯游戏近100个产品提供专项服务. WeTest 导读 在App上架苹果应用商店的过程中,相信大多数iOS开 ...

随机推荐

  1. LeetCode算法题-Implement Queue Using Stacks(Java实现)

    这是悦乐书的第195次更新,第201篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第57题(顺位题号是232).使用栈实现队列的以下操作. push(x) - 将元素x推 ...

  2. if else; while; break;continue ----流程控制系列

    第一种语法: if 条件: # @引号是为了把条件和结果分开. 结果1 # 一个Tab或者4个空格 @告诉程序满足上面的if条件才会执行结果1结果2 #如果条件为真(True),执行结果1,然后执行结 ...

  3. js data日期初始化的5种方法 [转]

    创建一个日期对象: 复制代码代码如下: var objDate=new Date([arguments list]);  参数形式有以下5种: 1)new Date("month dd,yy ...

  4. Redis 的安装 使用 通知事件

    Redis 的安装 使用 介绍: redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string.list.set.zset(sorted ...

  5. jvm运行时内存模式

    jvm内存模型 内存模型粗略划分为:堆和栈 详细划分为:堆,虚拟机栈,方法区,本地方法区,程序计数器 程序计数器: 为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程 ...

  6. 属性复制方法,当属性名字不一致时候可以传入匹配的Map

    /** * @param src * @param dest * @param filedMapping the diffrent fieldName mapping,key is src filen ...

  7. ssm框架的整合搭建(三)

    mybatis逆向工程工具类的使用---mybatis  generator 项目结构 配置文件 <?xml version="1.0" encoding="UTF ...

  8. 路飞学城-Python开发集训-第3章

    学习心得: 通过这一章的作业,使我对正则表达式的使用直接提升了一个level,虽然作业完成的不怎么样,重复代码有点多,但是收获还是非常大的,有点找到写代码的感觉了,遗憾的是,这次作业交过,这次集训就结 ...

  9. Python 字典一个易犯的错误

    一个易犯的错误,关于 Python 的传值(对于不可变量) 和 传引用(对于可变量),浅拷贝和深拷贝.废话不多说,看例子, 直接改变可变字典值,失败, >>> dic = dict. ...

  10. 手动安装 Eclipse 插件 Viplugin

    对 Vimer 来说,切换到 Eclipse 环境,传统的码code方式明显降低效率,Viplugin 是一款类 Vi 模拟器,能实现 Vi 的基本编辑功能. 安装方法 (适用于Windows 和 L ...