背景


在日常工作中,可能会经常遇到一些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方法相关推荐

  1. php中用unset报错,慎用PHP的unset、array_unique方法

    背景 在日常工作中,可能会经常遇到一些PHP的代码场景,需要我们去除数组中的某个项,通常会直接调用unset方法,但是如果用得不妥,会给自己挖坑 1.实操 以下使用具体例子进行证明 假设有数组如下值: ...

  2. 慎用jQuery中的submit()方法

    今天在做项目的过程中用到了submit()提交表单. 折腾许久很是郁闷,经过多方资料查询和亲测后,得出结论: 一定要慎用submit()方法 首先,在form表单中一定不要将input中的name或i ...

  3. 慎用BeanUtils的对象拷贝方法

    javaWeb开发过程中,经常需要在领域类之间进行实体对象的拷贝操作,比如把Po类的属性值拷贝给Dto类. BeanUtils这种工具类应用而生,比如org.apache.commons包中的Bean ...

  4. php 所有魔术方法,PHP常用的魔术方法及规则

    转:https://www.cnblogs.com/wanglijun/p/10926303.html 1. __construct 具有构造函数的类会在每次创建新对象时先调用此方法;初始化工作执行. ...

  5. c# 扩展方法奇思妙用变态篇四:string 的翻身革命

    string是各种编程语言中最基础的数据类型,长期以来受尽其它类的压迫,经常被肢解(Substring.Split).蹂躏(Join)... 而现在string要"翻身闹革命"了, ...

  6. c#扩展方法奇思妙用变态篇四:string 的翻身革命

    string是各种编程语言中最基础的数据类型,长期以来受尽其它类的压迫,经常被肢解(Substring.Split).蹂躏(Join)... 而现在string要"翻身闹革命"了, ...

  7. java调优方法,jvm监控工具

    graph LR A-->B 性能概述 程序性能表现形式 执行速度:程序响应速度,总耗时是否足够短 内存分配:内存分配是否合理,是否过多消耗内存或者存在泄漏 启动时间:程序运行到可以正常处理业务 ...

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

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

  9. Linux变量的定义、赋值、查看、删除(export、echo、unset)

    一.变量 概念:变量就是一个字符串,可以指向一个内容,该内容可以是路径.命令.数字.字符串等... 变量的分类: 环境变量:或者叫做全局变量 自定义变量:或者叫做局部变量 二.变量的定义与赋值 定义: ...

  10. CSS 样式的 initial(默认)和 inherit(继承)以及 unset

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

最新文章

  1. MySQL最高每秒57万写入,带你装X,带你飞!
  2. openwrt转载--openwrt框架分析
  3. style.display,有点问题
  4. 54 Django 模型层(1) 单表查询
  5. python使用指南(part1)--去重
  6. 总结python换源的方法:Linux与windows系统
  7. python集合可以修改吗_修改包含Python3中的集合的集合列表-问答-阿里云开发者社区-阿里云...
  8. 谢希仁计算机网络第七版 以太网单播和多播MAC地址范围[纠错]
  9. ECS查询特权接口DescribeAccountAttributes发布
  10. 阿里达摩院做AI这两年
  11. 举例mysql中group_concat()函数使用
  12. 减肥成功,给自己的减肥之路留个纪念(测试博客)
  13. 倒酒(拓展欧几里得)
  14. 第十周项目2——贮存班长信息的学生类
  15. 分组统计 - 不同时间颗粒度下,按照秒、分、时、日、周、月、季度、年 GROUP BY 分组统计 - (MySQL)
  16. python3计算列表长度
  17. IDEA:Idea 集成 EasyYApi 插件实现接口文档的生成与更新
  18. vue进阶04-vue文档生成工具vuepress2
  19. java odbc 实现access连接并导出mdb格式文件
  20. 认识JavaScript

热门文章

  1. 系统学习深度学习(二十八)--DSD
  2. 人脸验证(三)--FaceNet
  3. 各种安装教程---(自用)
  4. 读写分离架构的两种方式及问题
  5. 为何说要多用组合少用继承?
  6. CASIA WebFace、WIDDER FACE、FDDB、AFLW、CelebA训练集详解
  7. Linux编译libpcap
  8. 斯坦福大学CS143编译原理课程笔记:2.编译器结构
  9. stm32f10x系列.s汇编启动文件
  10. 【手把手教你全文检索】Lucene索引的【增、删、改、查】