背景


在日常工作中,可能会经常遇到一些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

php中用unset报错,慎用PHP的unset、array_unique方法相关推荐

  1. python https请求报错:SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] 解决方法

    python爬虫,使用requests库发送https请求报错:SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] 解决方法: imp ...

  2. maven引用servlet_解决Maven 项目报错 java.httpservlet和synchronized使用方法

    使用java8 的lanmbe表达式时,使用java1.8编译,则会报错 需要在pom.xml的中添加 org.apache.maven.plugins maven-compiler-plugin 2 ...

  3. 转)VCSA 6.5重启无法访问,报错“503 Service Unavailable”的解决方法

    转)VCSA 6.5重启无法访问,报错"503 Service Unavailable"的解决方法 1. 问题 重启vcenter,登陆vsphere client,提示 &quo ...

  4. 前端JavaScript 常见的报错及异常捕获与处理方法

    前言 在开发中,有时,我们花了几个小时写的js 代码,在浏览器调试一看,控制台一堆红,瞬间一万头草泥马奔腾而来. 至此,本文主要记录js 常见的一些错误类型,以及常见的报错信息,分析其报错原因,并给予 ...

  5. vs2010一运行就报错deven.exe assert failure 解决方法,卸载系统中.netFramework最新版本的(简体中文)...

    vs2010一运行就报错deven.exe assert failure 解决方法,卸载系统中.netFramework最新版本的(简体中文) 转载于:https://www.cnblogs.com/ ...

  6. 微信二次分享签名错误php,微信二次分享报错invalid signature问题及解决方法

    基于微信公众号开发的h5页面(使用jssdk接口),由用户A分享给用户B,用户B再次分享这个页面时,不能成功分享.问题出在用户B收到的分享链接与用户A打开的链接不同 A用户的链接为 B用户收到的连接 ...

  7. 程序执行报错Missing Connection or ConnectionString 解决方法

    程序执行报错Missing Connection or ConnectionString 解决方法 参考文章: (1)程序执行报错Missing Connection or ConnectionStr ...

  8. dedecms后台报错“Undefined variable cfg_domain_cookie”的解决方法

    dedecms后台报错"Undefined variable cfg_domain_cookie"的解决方法 打开调试模式 Notice: Undefined variable: ...

  9. word报错打不开的解决方法

    对于办公人员来说,word是日常办公中最常用的软件,根本就是离不开的.但有时需要Word删除表格的保留内容,有时反过来又需要删除Word的保留形式.一旦操作了出现word出现打不开或者出现一些异常现象 ...

最新文章

  1. 使用Windows 2008证书服务器为智能卡颁发证书
  2. SQLCLR(五)聚合
  3. redis占用内存过低_使用多种数据结构优化Redis 内存占用
  4. java返回object的类型_为什么标准java类的clone()返回Object而不是实际的类型
  5. Hystrix面试 - 基于 Hystrix 信号量机制实现资源隔离
  6. github 快速配置简易教程笔记
  7. Spring Boot 三大开发工具,你都用过几个?
  8. mysql FROM_UNIXTIME 格式化MYSQL时间戳函数
  9. Windows网络编程之UDP通信
  10. 【指数编制系列六】景气指数编制方法
  11. java hibernate 包_hibernatejar包官方下载-Hibernate.jar包下载 --pc6下载站
  12. 名片设计尺寸及注意事项(详尽),附加:文字转曲线或外框字;网址、文字转二维码方法
  13. 腾讯云不同账号之间VPC网络直接建立内网通讯
  14. 08-A. 旅馆顾客统计(静态成员)
  15. web程序设计(9)——编写阅读器(JQuery基础)
  16. Istio入坑指南(二) Istio的安装与简单的使用
  17. 6782. 2020.08.06【NOI2020】模拟T3 乌拉乌拉
  18. 电源学习(1):stm32单片机buck电路可调电源设计介绍
  19. qq空间小尾巴怎么修改
  20. Java实现汉字转换拼音功能

热门文章

  1. 回顾Mysql中聚合函数之concat和GROUP_CONCAT
  2. iOS微博授权登录及获取用户数据的方法
  3. 深度之眼论文学习方法
  4. 04 SYSTICK RCC
  5. 转换成html格式亚马逊工具,基本办公文书转HTML工具
  6. 多数据源和es版本问题
  7. 【第三方框架】Glid4.4 完全学习(未完待续)
  8. CPU巨头英特尔盯上GPU会咋样?
  9. QT软件开发: 使用QImage创建一张空图片
  10. [第四章]开发小要点:提高条形码识别率