浅谈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中的Class的几点个人看法
Oct 09 PHP
PHP学习之字符串比较和查找
Apr 17 PHP
php函数array_merge用法一例(合并同类数组)
Feb 03 PHP
php 模拟GMAIL,HOTMAIL(MSN),YAHOO,163,126邮箱登录的详细介绍
Jun 18 PHP
phpQuery让php处理html代码像jQuery一样方便
Jan 06 PHP
详解WordPress开发中过滤属性以及Sql语句的函数使用
Dec 25 PHP
Smarty环境配置与使用入门教程
May 11 PHP
24条货真价实的PHP代码优化技巧
Jul 28 PHP
YII框架中搜索分页jQuery写法详解
Dec 19 PHP
yii2安装详细流程
May 23 PHP
PHP从零开始打造自己的MVC框架之路由类实现方法分析
Jun 03 PHP
一文搞懂php的垃圾回收机制
Jun 18 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
FleaPHP的安全设置方法
2008/09/15 PHP
PHP XML备份Mysql数据库
2009/05/27 PHP
php单元测试phpunit入门实例教程
2017/11/17 PHP
PHP使用gearman进行异步的邮件或短信发送操作详解
2020/02/27 PHP
javascript 密码强度验证规则、打分、验证(给出前端代码,后端代码可根据强度规则翻译)
2010/05/18 Javascript
js各种验证文本框输入格式(正则表达式)
2010/10/22 Javascript
js下判断 iframe 是否加载完成的完美方法
2010/10/26 Javascript
写JQuery插件的基本知识
2013/11/25 Javascript
JavaScript实现自动弹出窗口并自动关闭窗口的方法
2015/08/06 Javascript
JavaScript脚本判断蜘蛛来源的方法
2015/09/22 Javascript
jquery+json实现动态商品内容展示的方法
2016/01/14 Javascript
用JS生成UUID的方法实例
2016/03/30 Javascript
JavaScript中关于for循环删除数组元素内容时出现的问题
2016/11/21 Javascript
jQuery如何跳转到另一个网页 就这么简单
2016/12/28 Javascript
微信小程序中使用Promise进行异步流程处理的实例详解
2017/08/17 Javascript
深入理解ES6学习笔记之块级作用域绑定
2017/08/19 Javascript
微信小程序switch开关选择器使用详解
2018/01/31 Javascript
Vue数据双向绑定原理及简单实现方法
2018/05/18 Javascript
深入webpack打包原理及loader和plugin的实现
2020/05/06 Javascript
js实现石头剪刀布游戏
2020/10/11 Javascript
在Vue中使用CSS3实现内容无缝滚动的示例代码
2020/11/27 Vue.js
[43:41]OG vs Newbee 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
[01:02:09]Liquid vs TNC 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21
2020/07/19 DOTA
python 垃圾收集机制的实例详解
2017/08/20 Python
Python使用三种方法实现PCA算法
2017/12/12 Python
Python实现字符型图片验证码识别完整过程详解
2019/05/10 Python
BLACKMORES澳洲官网:澳大利亚排名第一的保健品牌
2018/09/27 全球购物
高一家长会邀请函
2014/01/12 职场文书
革命先烈的英雄事迹材料
2014/02/15 职场文书
《木笛》教学反思
2014/03/01 职场文书
教育英语专业毕业生的求职信
2014/03/13 职场文书
计算机求职自荐信范文
2014/04/19 职场文书
询价采购方案
2014/06/09 职场文书
服务口号大全
2014/06/11 职场文书
高中信息技术教学反思
2016/02/16 职场文书
能让Python提速超40倍的神器Cython详解
2021/06/24 Python