浅谈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 相关文章推荐
如何分别全角和半角以避免乱码
Oct 09 PHP
解析PHP缓存函数的使用说明
May 10 PHP
PHP中怎样保持SESSION不过期 原理及方案介绍
Aug 08 PHP
PHP编译安装时常见错误解决办法
May 28 PHP
浅析Yii2 gridview实现批量删除教程
Apr 22 PHP
关于php 高并发解决的一点思路
Apr 16 PHP
PHP关键特性之命名空间实例详解
May 06 PHP
php获取数据库结果集方法(推荐)
Jun 01 PHP
PHPExcel实现表格导出功能示例【带有多个工作sheet】
Jun 13 PHP
PHP PDOStatement::setFetchMode讲解
Feb 03 PHP
基于Laravel-admin 后台的自定义页面用法详解
Sep 30 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
Feb 16 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制作静态网站的模板框架(一)
2006/10/09 PHP
IIS安装Apache伪静态插件的具体操作图文
2013/07/01 PHP
php使用Jpgraph绘制简单X-Y坐标图的方法
2015/06/10 PHP
PHP实现图片自动清理的方法
2015/07/08 PHP
PHP两个n位的二进制整数相加问题的解决
2018/08/26 PHP
javascript动态加载二
2012/08/22 Javascript
jquery的相对父元素和相对文档定位示例代码
2013/08/02 Javascript
解析JavaScript中的不可见数据类型
2013/12/02 Javascript
Nodejs实现的一个简单udp广播服务器、客户端
2014/09/25 NodeJs
js实现当鼠标移到表格上时显示这一格全部内容的代码
2016/06/12 Javascript
AngularJS入门教程之MVC架构实例分析
2016/11/01 Javascript
简单谈谈原生js的math对象
2017/06/27 Javascript
基于 Vue.js 2.0 酷炫自适应背景视频登录页面实现方式
2018/01/17 Javascript
VUE+Element UI实现简单的表格行内编辑效果的示例的代码
2018/10/31 Javascript
Vue 幸运大转盘实现思路详解
2019/05/06 Javascript
Vue使用axios出现options请求方法
2019/05/30 Javascript
Javascript实现打鼓效果
2021/01/29 Javascript
[01:13]这,就是刀塔
2014/07/16 DOTA
Python中运行并行任务技巧
2015/02/26 Python
利用python获取当前日期前后N天或N月日期的方法示例
2017/07/30 Python
python3监控CentOS磁盘空间脚本
2018/06/21 Python
使用pandas实现csv/excel sheet互相转换的方法
2018/12/10 Python
python中logging模块的一些简单用法的使用
2019/02/22 Python
scrapy-redis源码分析之发送POST请求详解
2019/05/15 Python
python图像和办公文档处理总结
2019/05/28 Python
Python中查看变量的类型内存地址所占字节的大小
2019/06/26 Python
python爬虫把url链接编码成gbk2312格式过程解析
2020/06/08 Python
Linux文件系统类型
2012/09/16 面试题
档案管理员岗位职责
2013/12/01 职场文书
大学生村官事迹材料
2014/01/21 职场文书
商场周年庆活动方案
2014/08/19 职场文书
习总书记三严三实学习心得体会
2014/10/13 职场文书
2014年库房工作总结
2014/11/26 职场文书
八年级作文之感恩
2019/11/22 职场文书
详解Nginx 工作原理
2021/03/31 Servers
【海涛解说】暗牧也疯狂,牛蛙成配角
2022/04/01 DOTA