PHP ·

PHP 数组是怎么实现的?

1. 如果是数值索引,散列值就是数值索引的值
2. 如果是字符串索引,就是字符串 key 通过 Time33 算法计算得到的散列值
3. 散列函数:哈希值与 ntablemask 按位或运算得到中间映射表下标(参考:https://www.0php.net/posts/PHP-%E6%95%B0%E7%BB%84%E5%BA%95%E5%B1%82%E5%AE%9E%E7%8E%B0/ArrayAccess.png
3. 为了实现散列表的有序性,在散列函数和元素数组中间加了一层 映射表(数组),大小与存储元素的数组相同,它存储的元素类型为整型,用于保存元素在实际存储的有序数组的下标。映射表的下标是 ,存储的值为实际数据的下标。
4. 哈希冲突:PHP采用链表法解决。映射表映射的是Bucket 链表
5. 自动扩容:首先检查数组中已经被删除的元素所占的比例(已经被删除但未被移出的元素),如果比例达到阀值就会触发重建索引的操作,这个过程会把删除的Bucket 移除,后面的 Bucket往前移补上空缺的 Bucket。如果未达到阀值,则会分配一个原数组 2 倍大小的新数组,然后把原数组的元素复制到新的数组上,最后重建索引。阀值不是固定的。
6. 重建索引:只是将旧数组的元素复制到新数组上,不会复制中间的映射表,因为中间的映射表已经无法使用了,k - v 的映射关系需要重新计算。

参与评论