浅谈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 相关文章推荐
Search Engine Friendly的URL设计
Oct 09 PHP
php 无法载入mysql扩展
Mar 12 PHP
php将时间差转换为字符串提示
Sep 07 PHP
PHP面向对象三大特点学习(充分理解抽象、封装、继承、多态)
May 07 PHP
常见php数据文件缓存类汇总
Dec 05 PHP
详解PHP中的状态模式编程
Aug 11 PHP
学习php设计模式 php实现享元模式(flyweight)
Dec 07 PHP
php通过淘宝API查询IP地址归属等信息
Dec 25 PHP
浅谈Laravel中的一个后期静态绑定
Aug 11 PHP
PHP实现的字符串匹配算法示例【sunday算法】
Dec 19 PHP
laravel框架中间件 except 和 only 的用法示例
Jul 12 PHP
PHP pthreads v3下worker和pool的使用方法示例
Feb 21 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数组操作
2011/12/30 PHP
php cli模式下获取参数的方法
2017/05/05 PHP
javascript实现Table间隔色以及选择高亮(和动态切换数据)的方法
2015/05/14 Javascript
个人总结的一些JavaScript技巧、实用函数、简洁方法、编程细节
2015/06/10 Javascript
百度地图api如何使用
2015/08/03 Javascript
Angularjs中UI Router全攻略
2016/01/29 Javascript
JavaScript Date对象详解
2016/03/01 Javascript
javascript解决小数的加减乘除精度丢失的方案
2016/05/31 Javascript
关于vuex的学习实践笔记
2017/04/05 Javascript
JavaScript实现网页头部进度条刷新
2017/04/16 Javascript
nodeJS实现简单网页爬虫功能的实例(分享)
2017/06/08 NodeJs
JavaScript中的高级函数
2018/01/04 Javascript
Vue全局分页组件的实现代码
2018/08/10 Javascript
如何能分清npm cnpm npx nvm
2019/01/17 Javascript
如何利用ES6进行Promise封装总结
2019/02/11 Javascript
vue3实现v-model原理详解
2019/10/09 Javascript
如何在vue中使用kindeditor富文本编辑器
2020/12/19 Vue.js
[42:32]VP vs RNG 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
python对象及面向对象技术详解
2016/07/19 Python
Python模拟三级菜单效果
2017/09/11 Python
python实现向微信用户发送每日一句 python实现微信聊天机器人
2019/03/27 Python
Python2与Python3的区别点整理
2019/12/12 Python
python中如何写类
2020/06/29 Python
Python urllib3软件包的使用说明
2020/11/18 Python
优衣库台湾官网:UNIQLO台湾
2019/02/01 全球购物
美国在线肉类和海鲜配送:Crowd Cow
2020/10/02 全球购物
党员思想汇报范文
2013/12/30 职场文书
人力资源管理专业求职信
2014/07/23 职场文书
小学生民族团结演讲稿
2014/08/27 职场文书
创先争优宣传标语
2014/10/08 职场文书
2014年信访维稳工作总结
2014/12/08 职场文书
优秀教师主要事迹材料
2015/11/04 职场文书
MySQL索引篇之千万级数据实战测试
2021/04/05 MySQL
python 模块重载的五种方法
2021/04/24 Python
redis限流的实际应用
2021/04/24 Redis
铁拳制作人赞《铁拳7》老头环Mod:制作精良 但别弄了
2022/04/03 其他游戏