浅谈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 相关文章推荐
PHPnow安装服务[apache_pn]失败的问题的解决方法
Sep 10 PHP
php数据库密码的找回的步骤
Jan 12 PHP
php开发过程中关于继承的使用方法分享
Jun 17 PHP
php读取二进制流(C语言结构体struct数据文件)的深入解析
Jun 13 PHP
PHP防范SQL注入的具体方法详解(测试通过)
May 09 PHP
php中使用session防止用户非法登录后台的方法
Jan 27 PHP
PHP面向对象继承用法详解(优化与减少代码重复)
Dec 02 PHP
php中通用的excel导出方法实例
Dec 30 PHP
详解laravel安装使用Passport(Api认证)
Jul 27 PHP
Swoole 5将移除自动添加Event::wait()特性详解
Jul 10 PHP
PHP命名空间定义与用法实例分析
Aug 14 PHP
php下的原生ajax请求用法实例分析
Feb 28 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中的mongodb select常用操作代码示例
2014/09/06 PHP
jQuery中与toggleClass等价的程序段 以及未来学习的方向
2010/03/18 Javascript
Javascript中Eval函数的使用
2010/03/23 Javascript
Ext GridPanel加载完数据后进行操作示例代码
2014/06/17 Javascript
Javascript 拖拽雏形(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
JavaSciprt中处理字符串之sup()方法的使用教程
2015/06/08 Javascript
js实现Select头像选择实时预览代码
2015/08/17 Javascript
jQuery实现的数值范围range2dslider选取插件特效多款代码分享
2015/08/27 Javascript
基于HTML+CSS,jQuery编写的简易计算器后续(添加了键盘监听)
2016/01/05 Javascript
Jquery attr()方法 属性赋值和属性获取详解
2016/04/15 Javascript
JS动态创建元素的两种方法
2016/04/20 Javascript
BootStrap中的table实现数据填充与分页应用小结
2016/05/26 Javascript
nodejs的HTML分析利器node-jquery用法浅析
2016/11/08 NodeJs
Vue.JS入门教程之自定义指令
2016/12/08 Javascript
使用webpack4编译并压缩ES6代码的方法示例
2019/04/24 Javascript
微信小程序swiper禁止用户手动滑动代码实例
2019/08/23 Javascript
javascript中可能用得到的全部的排序算法
2020/03/05 Javascript
详解Vue.js3.0 组件是如何渲染为DOM的
2020/11/10 Javascript
js用正则表达式筛选年月日的实例方法
2021/01/04 Javascript
javascript代码实现简易计算器
2021/01/25 Javascript
Python(Tornado)模拟登录小米抢手机
2013/11/12 Python
Python的ORM框架SQLObject入门实例
2014/04/28 Python
举例详解Python中threading模块的几个常用方法
2015/06/18 Python
Sublime开发python程序的示例代码
2018/01/24 Python
Flask 让jsonify返回的json串支持中文显示的方法
2018/03/26 Python
Python使用ConfigParser模块操作配置文件的方法
2018/06/29 Python
Python实现合并excel表格的方法分析
2019/04/13 Python
Python 3 实现定义跨模块的全局变量和使用教程
2019/07/07 Python
Python中的几种矩阵乘法(小结)
2019/07/10 Python
校园报刊亭的创业计划书
2014/01/02 职场文书
会计专业自我评价
2014/02/12 职场文书
诉讼授权委托书
2014/10/15 职场文书
大学生个人简历自荐信
2015/03/06 职场文书
2016年大学生就业指导课心得体会
2015/10/09 职场文书
详解gantt甘特图可拖拽、编辑(vue、react都可用 highcharts)
2021/11/27 Vue.js
你知道Java Spring的两种事务吗
2022/03/16 Java/Android