php array底层实现原理

最痛苦的事,是会把你对她的好当做理所当然。

 

函数符号表,全局变量等也都是基于hash表来实现

 

PHP的hash表具有如下特点:

  • 支持典型的key-value 查询
  • 可以当做数组使用
  • 添加、删除节点O(1)复杂度
  • key支持混合类型:同时存在关联数组和索引数组
  • Value支持混合类型: array('test', 1111)
  • 支持线性遍历:如foreach

Zend hash table 实现了典型的hash表散列结构,同时通过附加讴歌双向链表,提供了正向,反向遍历数组的功能;

 

散列结构:Zend 的散列结构是典型的hash表模型,通过链表的方式来解决冲突。需要注意的是zend的hash table是一个自增长的数据结构,当hash表数目满了之后,其本身会动态以2倍的方式扩容并重制元素位置。

另外,在进行key-value快速查找时候,zend本身还做了一些优化,通过空间换时间的方式加快速度。

 

双向链表:Zend hash table 通过一个链表结构,实现了元素的线性遍历。理论上,做遍历使用单向链表就够了,之所以使用双向链表,主要目的是为了快速删除,避免遍历。Zend hash table是一种复合型的结构,

作为数组使用时,即支持常见的关联数组也能够作为顺序索索数字来使用,甚至允许2者混合。

 

PHP关系数组:关联数组是典型的hash_table应用。

 

PHP索引数组:索引数组就是我们常见的数组,通过下标访问。例如 $arr[0],Zend HashTable内部进行了归一化处理,对于index类型key同样分配了hash值和nKeyLength(为0)。内部成员变量nNextFreeElement就是当前分配到的最大id,每次push后自动加一。正是这种归一化处理,PHP才能够实现关联和非关联的混合。由于push操作的特殊性,索引key在PHP数组中先后顺序并不是通过下标大小来决定,而是由push的先后决定。例如 $arr[1] = 2; $arr[2] = 3;对于double类型的key,Zend HashTable会将他当做索引key处理。

posted @ 2021-11-04 08:52  方达达  阅读(16)  评论(0编辑  收藏  举报