PHP中数组位置稀疏的探究

作者:掠影
最后编辑时间:2018-12-17 14:45:40
浏览次数:372



PHP中数组位置稀疏的探究

起因

  • 在使用PHP中array的过程中,经常遇到一种情况,即对于数字索引类型的数组,其索引值不连续,即$array = [ 0=>1, 2=>'c', 5=>'d']; 的情况,而这种情况对于某些依赖于数字索引位置的判断来说,常常会引起致命的错误:例如需要获取一个CSV文件,取其第X个字段时,可能就会导致空元素或者下标越界的情况;
  • 当然在PHP中这只是一个Notice级别的Error,但是却常常会由于开发者的不谨慎或者是无意识地错误判断,导致一系列的后续问题;故而本章通过分析这一情况的起因来简要介绍一下PHP中数组的一些特性,以及这一问题的解决方法:

原因分析

  • 首先,导致这一情况的出现,往往是人为地对数组元素进行操作(删除)的结果,举例而言,利用array_filter()函数,将会从数组中删除一系列不符合要求的元素,此时剩余下来的元素,其索引下标自然就不是连续的,或者是unset(), 直接删除了指定下标的元素,本节中将会介绍导致这一情况的相关函数:
  • 函数列举
    • array_unique(): 去除重复元素,这一过程中必然会删除后续的重复元素,导致下标不连续
    • array_filter():可参照unset()方法,直接删除下标对应元素
    • array_diff():差集
    • array_intersect:交集
    • unset(): 确切的说应该是一种语言特性,直接释放指定元素(不是单纯地释放空间)
  • 理论分析:以上我们假设所有的过程都是unset()函数的直接/间接结果,那么显而易见的,unset对于数组的操作必然是一个“事务”过程,而非单纯地释放一个元素的位置那么简单(P.S. 对于PHP中数组的结构,将会在下一篇文章中分析),而该事务的过程分析如下:
    • 1. 根据索引找到指定Slot的位置,获取上下文相关信息;
      • 2. 同一个hash值列表内,元素指针的操作(pNext, pLast, 该元素的上一个元素,指针指向下一个元素(或空);将该元素的下一个元素的指针指向上一个元素)
    • 3. 整个hash表内的元素指针的操作(pListNext,pListLast)
    • 4. 销毁该元素对应Bucket
    • 5. 整个对应的空间元素不再使用时,回收内存

我们可以看到这一过程中,对已有函数对应的数字索引是不做变动的,等于原先hash表中删除前后其他的元素无论是指针,key,还是value都是不受影响的;这也就是这一现象的起因;

解决方案

  1. 利用array_values()函数,对原有的array重新排列成一个新的hash表(索引重建)
  2. 利用array_slice() 获取原有array的全分片(重新开始分片)

取消

感谢您的支持,我会继续努力的!关闭

扫码支持
大家有钱的捧个钱场,没钱的捧个人场233333

打开支付宝扫一扫,即可进行扫码打赏哦

分享到: QQ空间 更多



评论区