浅谈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下MAIL的另一解决方案
Oct 09 PHP
PHP学习资料汇总与网址
Mar 16 PHP
理解PHP5中static和const关键字的区别
Mar 19 PHP
基于MySQL到MongoDB简易对照表的详解
Jun 03 PHP
PHP页面中文乱码分析
Oct 29 PHP
网站防止被刷票的一些思路与方法
Jan 08 PHP
php数组使用规则分析
Feb 27 PHP
PHP实现懒加载的方法
Mar 07 PHP
将PHP从5.3.28升级到5.3.29时Nginx出现502错误
May 09 PHP
php中关于长度计算容易混淆的问题分析
May 27 PHP
php获取给定日期相差天数的方法分析
Feb 20 PHP
PHP获取数组中指定的一列实例
Dec 27 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和XSS跨站攻击的防范
2007/04/17 PHP
ThinkPHP的截取字符串函数无法显示省略号的解决方法
2014/06/25 PHP
PHP SESSION的增加、删除、修改、查看操作
2015/03/20 PHP
PHP通过文件路径获取文件名的实例代码
2018/10/14 PHP
ThinkPHP5.1框架页面跳转及修改跳转页面模版示例
2019/05/06 PHP
laravel实现上传图片的两种方式小结
2019/10/12 PHP
ASP中进行HTML数据及JS数据编码函数
2009/11/11 Javascript
JavaScript对象之间的转换 jQuery对象和原声DOM
2011/03/07 Javascript
jQuery对html元素取值与赋值的方法
2013/11/20 Javascript
让alert不出现弹窗的两种方法
2014/05/18 Javascript
浅谈angular.js中实现双向绑定的方法$watch $digest $apply
2015/10/14 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单的实现代码
2016/06/23 Javascript
简单理解vue中实例属性vm.$els
2016/12/01 Javascript
jQuery简介_动力节点Java学院整理
2017/07/04 jQuery
NodeJS使用七牛云存储上传文件的方法
2017/07/24 NodeJs
浅谈nodejs中的类定义和继承的套路
2017/07/26 NodeJs
基于Vue生产环境部署详解
2017/09/15 Javascript
JS端基于download.js实现图片、视频时直接下载而不是打开预览
2020/05/09 Javascript
JS替换字符串中指定位置的字符(多种方法)
2020/05/28 Javascript
python模拟表单提交登录图书馆
2018/04/27 Python
Python中的元组介绍
2019/01/28 Python
利用python开发app实战的方法
2019/07/09 Python
Ubuntu中配置TensorFlow使用环境的方法
2020/04/21 Python
Python select及selectors模块概念用法详解
2020/06/22 Python
Python截图并保存的具体实例
2021/01/14 Python
CSS3 text-shadow实现文字阴影效果
2016/02/24 HTML / CSS
突袭HTML5之Javascript API扩展4—拖拽(Drag/Drop)概述
2013/01/31 HTML / CSS
Aosom西班牙:家具在线商店
2020/06/11 全球购物
教师的实习鉴定
2013/12/15 职场文书
教师学习培训邀请函
2014/02/04 职场文书
建筑施工安全责任书
2014/07/24 职场文书
门卫岗位职责说明书
2014/08/18 职场文书
2014党员学习习主席讲话思想汇报
2014/09/15 职场文书
2015年党日活动总结范文
2015/03/25 职场文书
2016年敬老月活动总结
2016/04/05 职场文书
python 调用js的四种方式
2021/04/11 Python