当前位置: 首页 > 后端技术 > PHP

PHP的unset和array_unique方法慎用

时间:2023-03-29 16:20:03 PHP

背景在日常工作中,可能经常会遇到一些PHP代码场景,需要我们移除数组中的某一项。通常会直接调用unset方法,但是如果不会用嘛,我给自己挖个坑1.下面用具体的例子来证明。假设有一个数组,其值如下:$age_arr=[0,12,43,34,24,63,90];1).设置场景是去掉age的值为0,简单的方法如下:foreach($age_arras$k=>$age){if($age==0){unset($age_arr[$k]);}}2).设置场景取出0值后取数组中第一个人的年龄$first_people=$age_arr[0];结果会报错,Undefinedoffset:02。分析为什么会报错?带着疑惑,我们尝试输出unset前后的数组,检查差异$age_arr=[0,12,43,34,24,63,90];echo'unsetbefore:'.json_encode($age_arr).'
';unset($age_arr[0]);echo'afterunset:'.json_encode($age_arr).'
';输出结果:未设置前:[0,12,43,34,24,63,90]未设置后:{“1”:12,“2”:43,“3”:34,“4”:24,“5":63,"6":90}从上面可以看出,PHP在对数组进行unset操作时,会将数组转换为关联数组。当我们使用json_encode时,数据结构会不一致。执行unset方法时,数组会移除对应索引下标指定的值,索引不会被重置。从上面的结果可以看出,原来0的下标没有了,但是1的下标不会变成0.3。深入研究,我们会调用其他PHP数组相关的方法进行验证,看看其他方法是否能正常返回结果,除了unset会去除数组项外,array_unique方法会去除重复项。下面方法演示:$age_arr=[0,12,43,34,24,63,43,90];echo'beforearray_unique:'.json_encode($age_arr).'
';$age_arr=array_unique($age_arr);echo'afterarray_unique:'.json_encode($age_arr).'
';结果:在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}从上面可以看出,PHP在对数组进行array_unique操作时,会将数组转换为关联数组。执行array_unique方法时,数组会移除对应索引下标指定的值,索引不会被重置。从上面的结果可以看出,原来6的下标没有了,但是7的下标不会变成6,所以在使用unset和array_unique的时候,会转成关联数组。如果后面的逻辑使用方括号来索引值,难免会出问题,小心!4.解决方法是使用array_values方法重新设置索引排序。官方文档如下:array_values(PHP4,PHP5,PHP7)array_values——返回数组中的所有值说明arrayarray_values(array$array)array_values()返回数组中的所有值输入数组并为其建立一个数字索引。来自KingFer