php中用unset报错,慎用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
php中用unset报错,慎用PHP的unset、array_unique方法相关推荐
- python https请求报错:SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] 解决方法
python爬虫,使用requests库发送https请求报错:SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] 解决方法: imp ...
- maven引用servlet_解决Maven 项目报错 java.httpservlet和synchronized使用方法
使用java8 的lanmbe表达式时,使用java1.8编译,则会报错 需要在pom.xml的中添加 org.apache.maven.plugins maven-compiler-plugin 2 ...
- 转)VCSA 6.5重启无法访问,报错“503 Service Unavailable”的解决方法
转)VCSA 6.5重启无法访问,报错"503 Service Unavailable"的解决方法 1. 问题 重启vcenter,登陆vsphere client,提示 &quo ...
- 前端JavaScript 常见的报错及异常捕获与处理方法
前言 在开发中,有时,我们花了几个小时写的js 代码,在浏览器调试一看,控制台一堆红,瞬间一万头草泥马奔腾而来. 至此,本文主要记录js 常见的一些错误类型,以及常见的报错信息,分析其报错原因,并给予 ...
- vs2010一运行就报错deven.exe assert failure 解决方法,卸载系统中.netFramework最新版本的(简体中文)...
vs2010一运行就报错deven.exe assert failure 解决方法,卸载系统中.netFramework最新版本的(简体中文) 转载于:https://www.cnblogs.com/ ...
- 微信二次分享签名错误php,微信二次分享报错invalid signature问题及解决方法
基于微信公众号开发的h5页面(使用jssdk接口),由用户A分享给用户B,用户B再次分享这个页面时,不能成功分享.问题出在用户B收到的分享链接与用户A打开的链接不同 A用户的链接为 B用户收到的连接 ...
- 程序执行报错Missing Connection or ConnectionString 解决方法
程序执行报错Missing Connection or ConnectionString 解决方法 参考文章: (1)程序执行报错Missing Connection or ConnectionStr ...
- dedecms后台报错“Undefined variable cfg_domain_cookie”的解决方法
dedecms后台报错"Undefined variable cfg_domain_cookie"的解决方法 打开调试模式 Notice: Undefined variable: ...
- word报错打不开的解决方法
对于办公人员来说,word是日常办公中最常用的软件,根本就是离不开的.但有时需要Word删除表格的保留内容,有时反过来又需要删除Word的保留形式.一旦操作了出现word出现打不开或者出现一些异常现象 ...
最新文章
- 使用Windows 2008证书服务器为智能卡颁发证书
- SQLCLR(五)聚合
- redis占用内存过低_使用多种数据结构优化Redis 内存占用
- java返回object的类型_为什么标准java类的clone()返回Object而不是实际的类型
- Hystrix面试 - 基于 Hystrix 信号量机制实现资源隔离
- github 快速配置简易教程笔记
- Spring Boot 三大开发工具,你都用过几个?
- mysql FROM_UNIXTIME 格式化MYSQL时间戳函数
- Windows网络编程之UDP通信
- 【指数编制系列六】景气指数编制方法
- java hibernate 包_hibernatejar包官方下载-Hibernate.jar包下载 --pc6下载站
- 名片设计尺寸及注意事项(详尽),附加:文字转曲线或外框字;网址、文字转二维码方法
- 腾讯云不同账号之间VPC网络直接建立内网通讯
- 08-A. 旅馆顾客统计(静态成员)
- web程序设计(9)——编写阅读器(JQuery基础)
- Istio入坑指南(二) Istio的安装与简单的使用
- 6782. 2020.08.06【NOI2020】模拟T3 乌拉乌拉
- 电源学习(1):stm32单片机buck电路可调电源设计介绍
- qq空间小尾巴怎么修改
- Java实现汉字转换拼音功能