浅谈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写入WRITE编码为UTF8的文件的实现代码
Jul 07 PHP
php学习笔记 数组的常用函数
Jun 13 PHP
用mysql_fetch_array()获取当前行数据的方法详解
Jun 05 PHP
PHP中copy on write写时复制机制介绍
May 13 PHP
Fedora下安装php Redis扩展笔记
Sep 03 PHP
php数组添加与删除单元的常用函数实例分析
Feb 16 PHP
php中Snoopy类用法实例
Jun 19 PHP
PHP网站建设的流程与步骤分享
Sep 25 PHP
大家须知简单的php性能优化注意点
Jan 04 PHP
高质量PHP代码的50个实用技巧必备(下)
Jan 22 PHP
详解PHP发送邮件知识点
May 06 PHP
使用Zookeeper分布式部署PHP应用程序
Mar 15 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
PHP5常用函数列表(分享)
2013/06/07 PHP
解析php类的注册与自动加载
2013/07/05 PHP
PHP使用DOMDocument类生成HTML实例(包含常见标签元素)
2014/06/25 PHP
解决laravel 5.1报错:No supported encrypter found的办法
2017/06/07 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
2020/03/26 PHP
javascript实现动态增加删除表格行(兼容IE/FF)
2007/04/02 Javascript
基于mouseout和mouseover等类似事件的冒泡问题解决方法
2013/11/18 Javascript
javascript将异步校验表单改写为同步表单
2015/01/27 Javascript
javascript实现淘宝幻灯片广告展示效果
2015/04/27 Javascript
php基于redis处理session的方法
2016/03/14 Javascript
JavaScript实现的微信二维码图片生成器的示例
2016/10/26 Javascript
js 数据存储和DOM编程
2017/02/09 Javascript
详解JavaScript 中getElementsByName在IE中的注意事项
2017/02/21 Javascript
完美解决axios跨域请求出错的问题
2018/02/05 Javascript
学习使用ExpressJS 4.0中的新Router的用法
2018/11/06 Javascript
JS实现的A*寻路算法详解
2018/12/14 Javascript
js实现九宫格布局效果
2020/05/28 Javascript
Python中线程的MQ消息队列实现以及消息队列的优点解析
2016/06/29 Python
Python文本处理之按行处理大文件的方法
2018/04/09 Python
一文了解Python并发编程的工程实现方法
2019/05/31 Python
解决python tkinter界面卡死的问题
2019/07/17 Python
python web框架 django wsgi原理解析
2019/08/20 Python
python 用 xlwings 库 生成图表的操作方法
2019/12/22 Python
Python实现随机生成任意数量车牌号
2020/01/21 Python
Python多线程正确用法实例解析
2020/05/30 Python
python基于Kivy写一个图形桌面时钟程序
2021/01/28 Python
网页切图的CSS和布局经验与要点
2015/04/09 HTML / CSS
如何减少垃圾回收让内存更加有效使用
2013/10/18 面试题
Python文件操作的面试题
2013/06/22 面试题
学雷锋先进个人事迹
2014/05/26 职场文书
广播体操口号
2014/06/18 职场文书
民族学专业职业生涯规划范文:积跬步以至千里
2014/09/11 职场文书
2014年四风问题个人对照自查剖析材料
2014/09/15 职场文书
培训班开班主持词
2015/07/02 职场文书
远程教育学习心得体会
2016/01/23 职场文书
php 解析非标准json、非规范json
2021/04/01 PHP