浅谈PHP中foreach/in_array的使用


Posted in PHP onNovember 02, 2015

php在开发效率很高,这是无可厚非的,但是却是在牺牲执行效率的。php数组功能非常强大,但是也要多加考虑,多试几种情况情况,以防万一,这里,我就简单的说两个遇到的坑,以后如果有发现更多的,再补上吧!

foreach 提供了遍历数组的简单方式,可以很方便的读取到数据或对象的内容,但是官方文档说了,由于 foreach 依赖内部数组指针,在循环中修改其值将可能导致意外的行为。所以,基本上,
1、不要想在循环内部修改里面的值,否则结果将超出你想要的;
2、使用'&'是一个安全的方式,虽然很少用到,但是在用到时,在引用结束后,应立即调用unset函数销毁该变量,否则,在接下来的代码里,如果有再次使用到此变量,那么循环的最后一次值就将被修改了,从而得到了意外的值,比如:在列表循环输出时,最后一行输出将会出现许多乱七八糟的值或者空值。使用unset可解决此问题。

我们来看个示例

<?php 
/*-------------------------------------------------------------------------*/ 
/* foreach example 1: value only */ 
echo "foreach example 1: value only ".'<br />'; 
$a = array(1, 2, 3, 17); 
foreach ($a as $v) { 
echo "Current value of ".$a.":". $v."<br />"; 
} 
?> 
// 运行结果 
foreach example 1: value only 
Current value of $a: 1 
Current value of $a: 2 
Current value of $a: 3 
Current value of $a: 17

in_array,其含义是检查前一个字符串是否存在于后一个数组当中,而且大多数情况下,它也是这么工作的,但是当后面的数组是整数时,如array(0,1,2,3)时,就出问题了,php会将前的字符串进行intval,从而都会得到0这个值,那么如果恰巧,你的数组当中有这个值,那么等式就成立了,是不是又超出了预期呢?
所以,当确定后面的数据是整数时,尤其是还有可能为0(这个可能代替所有的字符串了),你就千万不能再使用这个函数了,可使用key_exists来代替,但是后面的数据则需要使用array_flip进行倒转操作了。

我们再来看个示例

function search($keyWord, $stack) {//此处判断是应该更新还是插入

      foreach ($stack as $key => $val) {

        if (in_array($keyWord, $val)) {

          return TRUE;

        }

      }

      return FALSE;

    }

当一个字符串被当作数组来去取值时,又会发生什么呢?php是一门容错性很强的语言,它会尽量帮你改正错误,所以很聪明地将你的引用下标转化为整数,当然就得到0了,那么字符串下标为0取值则又会得到第一个字符串的值,是不是又超出了你的预期呢?解决方法是,在引用下标之前,还是确认一下这个变量是不是一个数组吧,is_array。

虽然有许许多多的前辈遇到这样或那样的问题,也在不停地说,但是我们终究还是免不了,不停去犯错。这也许就是社会吧!大家都这么忙,哪有时间去破解你那烂代码! 哈哈

PHP 相关文章推荐
PHP XML备份Mysql数据库
May 27 PHP
PHP中用正则表达式清除字符串的空白
Jan 17 PHP
PHP中uploaded_files函数使用方法详解
Mar 09 PHP
解析dedeCMS验证码的实现代码
Jun 07 PHP
PHP eval函数使用介绍
Dec 08 PHP
PHP中实现crontab代码分享
Mar 26 PHP
php实现网站留言板功能
Nov 04 PHP
php通过执行CutyCapt命令实现网页截图的方法
Sep 30 PHP
PHP实现十进制、二进制、八进制和十六进制转换相关函数用法分析
Apr 25 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
Nov 13 PHP
PHP实现批量修改文件名的方法示例
Sep 18 PHP
php array 转json及java 转换 json数据格式操作示例
Nov 13 PHP
php防止用户重复提交表单
Nov 02 #PHP
windows8.1下Apache+Php+MySQL配置步骤
Oct 30 #PHP
php验证邮箱和ip地址最简单方法汇总
Oct 30 #PHP
php三种实现多线程类似的方法
Oct 30 #PHP
php搜索文件程序分享
Oct 30 #PHP
纯php生成随机密码
Oct 30 #PHP
php利用smtp类实现电子邮件发送
Oct 30 #PHP
You might like
PHP面向对象三大特点学习(充分理解抽象、封装、继承、多态)
2012/05/07 PHP
php和jquery实现地图区域数据统计展示数据示例
2014/02/12 PHP
ThinkPHP分页实例
2014/10/15 PHP
php更新mysql后获取改变行数的方法
2014/12/25 PHP
php去除头尾空格的2种方法
2015/03/16 PHP
javascript 运算数的求值顺序
2011/08/23 Javascript
使用JavaScript制作一个简单的计数器的方法
2015/07/07 Javascript
jQuery实现图片文字淡入淡出效果
2015/12/21 Javascript
javascript中对Date类型的常用操作小结
2016/05/19 Javascript
详解Bootstrap的iCheck插件checkbox和radio
2016/08/24 Javascript
AngularJS监听路由的变化示例代码
2016/09/23 Javascript
使用ionic播放轮询广告的实现方法(必看)
2017/04/24 Javascript
jstree单选功能的实现方法
2017/06/07 Javascript
vue中如何实现变量和字符串拼接
2017/06/19 Javascript
js判断浏览器的环境(pc端,移动端,还是微信浏览器)
2020/12/24 Javascript
Node.js API详解之 tty功能与用法实例分析
2020/04/27 Javascript
浅谈Vue static 静态资源路径 和 style问题
2020/11/07 Javascript
js实现有趣的倒计时效果
2021/01/19 Javascript
[03:45]Newbee战队出征西雅图 决战2016国际邀请赛
2016/08/02 DOTA
python生成器表达式和列表解析
2016/03/10 Python
Python学习pygal绘制线图代码分享
2017/12/09 Python
Python使用os.listdir()和os.walk()获取文件路径与文件下所有目录的方法
2019/04/01 Python
详解python pandas 分组统计的方法
2019/07/30 Python
Python单元测试工具doctest和unittest使用解析
2019/09/02 Python
使用python获取邮箱邮件的设置方法
2019/09/20 Python
使用pyhon绘图比较两个手机屏幕大小(实例代码)
2020/01/03 Python
浅谈anaconda python 版本对应关系
2020/10/07 Python
Pyqt助手安装PyQt5帮助文档过程图解
2020/11/20 Python
如何在网站上添加谷歌定位信息
2016/04/16 HTML / CSS
html5的画布canvas——画出简单的矩形、三角形实例代码
2013/06/09 HTML / CSS
美国环保婴儿用品公司:The Honest Company
2017/11/23 全球购物
我的applet原先好好的, 一放到web server就会有问题,为什么?
2016/05/10 面试题
介绍一下Linux中的链接
2016/05/28 面试题
项目考察欢迎辞
2014/01/17 职场文书
罗马假日观后感
2015/06/08 职场文书
Python jiaba库的使用详解
2021/11/23 Python