背景


在日常工作中,可能会经常遇到一些PHP的代码场景,需要我们去除数组中的某个项,通常会直接调用unset方法,但是如果用得不妥,会给自己挖坑

1.实操

以下使用具体例子进行证明
假设有数组如下值:


$age_arr=[0,12,43,34,24,63,90];

1).设定场景是去除年龄为0的数值.简单方法如下:


foreach($age_arr as $k=>$age){
if($age==0){
unset($age_arr[$k]);
}
}

2).设定场景取去除0值之后的数组中的第一个人的年龄


$first_people=$age_arr[0];

结果会报错,Undefined offset: 0

2.剖析

为什么会报错呢?带着疑问,我们尝试输出unset前后的数组,查看其的区别


$age_arr=[0,12,43,34,24,63,90];
echo 'unset前 :'.json_encode($age_arr).'</br>';
unset($age_arr[0]);
echo 'unset后 :'.json_encode($age_arr).'</br>';

输出结果:


unset前 :[0,12,43,34,24,63,90]
unset后 :{"1":12,"2":43,"3":34,"4":24,"5":63,"6":90}

由上可得知,对数组进行unset操作的时候,PHP会将数组转化为关联数组。当我们使用json_encode的时候,会导致数据结构不一致。而当unset方法执行后,数组会去除相应索引下标指定的值,并且不会重置索引。如上结果可知原先下标为0的已经没了,但为1的不会变成0.

3.深入研究

我们接下来调用其他PHP的数组相关方法进行验证,看其他方法是否能正常反馈结果
除了unset会去除数组项外,array_unique方法会去除重复项,以下方法演示:


$age_arr=[0,12,43,34,24,63,43,90];
echo 'array_unique前 :'.json_encode($age_arr).'</br>';
$age_arr=array_unique($age_arr);
echo 'array_unique后 :'.json_encode($age_arr).'</br>';

结果:


array_unique前 :[0,12,43,34,24,63,43,90]
array_unique后 :{"0":0,"1":12,"2":43,"3":34,"4":24,"5":63,"7":90}

由上可得知,对数组进行array_unique操作的时候,PHP会将数组转化为关联数组。而当array_unique方法执行后,数组会去除相应索引下标指定的值,并且不会重置索引。如上结果可知原先下标为6的已经没了,但为7的不会变成6.

故当使用unset、array_unique时,都会转换成关联数组,后续逻辑如使用中括号索引取值,必然会有问题,需谨慎!

4.解决办法

使用array_values方法进行重置索引排序。

官方文档介绍如下:

array_values

(PHP 4, PHP 5, PHP 7)

array_values — 返回数组中所有的值

说明

array array_values( array $array)

array_values() 返回 input 数组中所有的值并给其建立数字索引。

by KingFer

原文地址:https://segmentfault.com/a/1190000016392045

慎用PHP的unset、array_unique方法的更多相关文章

  1. [Effective Java]第七章 方法

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  2. 谈谈一些有趣的CSS题目(十五)-- 谈谈 CSS 关键字 initial、inherit 和 unset

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

  3. css 中的 initial inherit unset 意思

    写css时,在对属性进行选值,经常遇到unset , initial,inherit三个值.这几个值的含义. 1.inherit 可继承性 继承的意思. 每一个 CSS 属性都有一个特性就是,这个属性 ...

  4. 谈谈 CSS 关键字 initial、inherit 和 unset

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

  5. 《Effective Java》第7章 方法

    第38条:检查参数的有效性 对于公有的方法,要用javadoc的@throws标签(tag)在文档中说明违反参数值限制时会抛出的异常.这样的异常通常为IllegalArgumentException, ...

  6. PHP常用的魔术方法及规则

    1. __construct 具有构造函数的类会在每次创建新对象时先调用此方法;初始化工作执行.2. __desstruct 对象的所有引用都被删除或者当对象被显式销毁时执行.3.__call()在对 ...

  7. 写了这么多年 CSS,initial 和 inherit 以及 unset 和 revert 还傻傻分不清楚?

    经常会碰到,问一个 CSS 属性,例如 position 有多少取值. 通常的回答是 static.relative.absolute 和 fixed .当然,还有一个稍微生僻的 sticky .其实 ...

  8. Spring(三)AOP面向切面编程

    原文链接:http://www.orlion.ga/205/ 一.AOP简介 1.AOP概念 参考文章:http://www.orlion.ml/57 2.AOP的产生 对于如下方法:     pub ...

  9. OracleHelper(对增删改查分页查询操作进行了面向对象的封装,对批量增删改操作的事务封装)

    公司的一个新项目使用ASP.NET MVC开发,经理让我写个OracleHelper,我从网上找了一个比较全的OracleHelper类,缺点是查询的时候返回DataSet,数据增删改要写很多代码(当 ...

随机推荐

  1. JavaThread等待/通知经典范式

    JavaThread等待/通知经典范式 package com.stono.thread; import java.text.SimpleDateFormat; import java.util.Da ...

  2. Android-黑科技-微信抢红包必备软件

                        黑科技微信抢红包 介绍: 本节类容和技术无太大关系.主要是个人认为比較好玩,年关将至,对于新起之秀微信红包.绝对是过春节首选.看到就是赚到,速速围观下载.眼下仅 ...

  3. HDU 2717

    Catch That Cow Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  4. sqlalchemy.orm.exc.flusherror:错误解决

    使用sqlalchemy创建model 初次代码: class UserModel(db.Model): __tablename__ = "users" id = db.Colum ...

  5. 站点搭建从零開始(七) WordPress站点的完好

    1.WordPress站点前后端经常使用语言简单介绍和执行过程 通常一个站点的整个构建过程中须要大量的技术支持,尤其是用到非常多种计算机语言.站点的构建主要分后端和前端两部分,后端代码在server上 ...

  6. Makefile中怎样调用python和perl文件为自己提供须要的数据

    Makefile中怎样调用python和perl文件为自己提供须要的数据,利用print函数对外输出数据 实例代码例如以下 perl.pl #!/usr/bin/perl print("he ...

  7. nyoj170 网络的可靠性(第三届河南省程序设计大赛)

    题目170 题目信息 执行结果 pid=170" style="text-decoration:none; color:rgb(55,119,188)">本题排行 ...

  8. Shell case esac语句【转】

    本文转载自:http://c.biancheng.net/cpp/view/7006.html C语言中文网推出辅导班啦,包括「C语言辅导班.C++辅导班.算法/数据结构辅导班」,全部都是一对一教学: ...

  9. MongoDB Master-Slave cluster with authentication setup

    Master Server create mongo db folder with sub folders like data, conf, && log mkdir -p /opt/ ...

  10. shp系列(五)——利用C++进行shp文件的写(创建)

    之前介绍了shp文件.dbf文件和shx文件的的读取,接下来将分别介绍它们的创建过程.一般来说,读和写的一一对应的,写出的文件就是为了保存数据供以后读取的.写的文件要符合shapefile的标准.之前 ...