慎用PHP的unset、array_unique方法
背景
在日常工作中,可能会经常遇到一些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
转载于:https://www.cnblogs.com/lalalagq/p/9971374.html
慎用PHP的unset、array_unique方法相关推荐
- php中用unset报错,慎用PHP的unset、array_unique方法
背景 在日常工作中,可能会经常遇到一些PHP的代码场景,需要我们去除数组中的某个项,通常会直接调用unset方法,但是如果用得不妥,会给自己挖坑 1.实操 以下使用具体例子进行证明 假设有数组如下值: ...
- 慎用jQuery中的submit()方法
今天在做项目的过程中用到了submit()提交表单. 折腾许久很是郁闷,经过多方资料查询和亲测后,得出结论: 一定要慎用submit()方法 首先,在form表单中一定不要将input中的name或i ...
- 慎用BeanUtils的对象拷贝方法
javaWeb开发过程中,经常需要在领域类之间进行实体对象的拷贝操作,比如把Po类的属性值拷贝给Dto类. BeanUtils这种工具类应用而生,比如org.apache.commons包中的Bean ...
- php 所有魔术方法,PHP常用的魔术方法及规则
转:https://www.cnblogs.com/wanglijun/p/10926303.html 1. __construct 具有构造函数的类会在每次创建新对象时先调用此方法;初始化工作执行. ...
- c# 扩展方法奇思妙用变态篇四:string 的翻身革命
string是各种编程语言中最基础的数据类型,长期以来受尽其它类的压迫,经常被肢解(Substring.Split).蹂躏(Join)... 而现在string要"翻身闹革命"了, ...
- c#扩展方法奇思妙用变态篇四:string 的翻身革命
string是各种编程语言中最基础的数据类型,长期以来受尽其它类的压迫,经常被肢解(Substring.Split).蹂躏(Join)... 而现在string要"翻身闹革命"了, ...
- java调优方法,jvm监控工具
graph LR A-->B 性能概述 程序性能表现形式 执行速度:程序响应速度,总耗时是否足够短 内存分配:内存分配是否合理,是否过多消耗内存或者存在泄漏 启动时间:程序运行到可以正常处理业务 ...
- 谈谈一些有趣的CSS题目(十五)-- 谈谈 CSS 关键字 initial、inherit 和 unset
开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...
- Linux变量的定义、赋值、查看、删除(export、echo、unset)
一.变量 概念:变量就是一个字符串,可以指向一个内容,该内容可以是路径.命令.数字.字符串等... 变量的分类: 环境变量:或者叫做全局变量 自定义变量:或者叫做局部变量 二.变量的定义与赋值 定义: ...
- CSS 样式的 initial(默认)和 inherit(继承)以及 unset
经常会碰到,问一个 CSS 属性,例如 position 有多少取值. 通常的回答是 static.relative.absolute 和 fixed .当然,还有一个极少人了解的 sticky .其 ...
最新文章
- MySQL最高每秒57万写入,带你装X,带你飞!
- openwrt转载--openwrt框架分析
- style.display,有点问题
- 54 Django 模型层(1) 单表查询
- python使用指南(part1)--去重
- 总结python换源的方法:Linux与windows系统
- python集合可以修改吗_修改包含Python3中的集合的集合列表-问答-阿里云开发者社区-阿里云...
- 谢希仁计算机网络第七版 以太网单播和多播MAC地址范围[纠错]
- ECS查询特权接口DescribeAccountAttributes发布
- 阿里达摩院做AI这两年
- 举例mysql中group_concat()函数使用
- 减肥成功,给自己的减肥之路留个纪念(测试博客)
- 倒酒(拓展欧几里得)
- 第十周项目2——贮存班长信息的学生类
- 分组统计 - 不同时间颗粒度下,按照秒、分、时、日、周、月、季度、年 GROUP BY 分组统计 - (MySQL)
- python3计算列表长度
- IDEA:Idea 集成 EasyYApi 插件实现接口文档的生成与更新
- vue进阶04-vue文档生成工具vuepress2
- java odbc 实现access连接并导出mdb格式文件
- 认识JavaScript