美文网首页
php数组底层实现

php数组底层实现

作者: justonemoretry | 来源:发表于2019-06-19 13:35 被阅读0次

最近面试遇到这个,因为自己已经开始自我嫌弃php了,之前准备的时候就没看这块了,现在被问了主语言,不会就他喵的很尴尬了,补一补~

介绍

PHP 的数组是很强大且很重要的数据类型,它既支持单纯的数组又支持键值对数组,其中键值对数组类似于 Go 语言的map但又保证了能够按顺序遍历,并且由于采用了哈希表实现能够保证基本查找时间复杂度为 O(1)。所以接下来让我们了解一下 PHP 数组的底层实现吧~

数组的数据结构

一个数组在 PHP 内核里是长什么样的呢?我们可以从 PHP 的源码里看到其结构如下:

1、nNumUsed和nNumOfElements的区别:nNumUsed指的是arData数组中已使用的Bucket数,因为数组在删除元素后只是将该元素Bucket对应值的类型设置为IS_UNDEF(因为如果每次删除元素都要将数组移动并重新索引太浪费时间),而nNumOfElements对应的是数组中真正的元素个数。

2、nTableSize数组的容量,该值为 2 的幂次方。PHP 的数组是不定长度但 C 语言的数组定长的,为了实现 PHP 的不定长数组的功能,采用了「扩容」的机制,就是在每次插入元素的时候判断nTableSize是否足以储存。如果不足则重新申请 2 倍nTableSize大小的新数组,并将原数组复制过来(此时正是清除原数组中类型为IS_UNDEF元素的时机)并且重新索引。

3、nNextFreeElement保存下一个可用数字索引,例如在 PHP 中$a[] = 1;这种用法将插入一个索引为nNextFreeElement的元素,然后nNextFreeElement自增 1。

_zend_array 这个结构先讲到这里,有些结构体成员的作用在下文会解释,不用紧张O(∩_∩)O哈哈~。下面来看看作为数组成员的 Bucket 结构:

typedef struct _Bucket {

// 数组元素的值

zval              val;

// key 通过 Time 33 算法计算得到的哈希值或数字索引

zend_ulong        h;

// 字符键名,数字索引则为 NULL

zend_string      *key;

} Bucket;

更多内容见:https://juejin.im/post/5b967696e51d450e452a74d8

相关文章

  • php数组底层实现

    最近面试遇到这个,因为自己已经开始自我嫌弃php了,之前准备的时候就没看这块了,现在被问了主语言,不会就他喵的很尴...

  • PHP 数组的底层实现

    PHP 数组的底层主要是通过 HashTable 实现,HashTable 通过映射函数或者散列函数将 Strin...

  • JDK1.8关于HashMap的变化

    底层实现原理 ++1.7++HashMap底层是使用数组+链表实现 ++1.8++HashMap底层是使用数组+链...

  • ArrayList和LinkedList的区别

    1.底层实现层面: ArrayList底层是由数组实现,是一个动态数组,而LinkedList底层是一个双向链表。...

  • 2018.01.03 周三--【技术文章】《PHP扩展及核心》

    一、主要内容: 1️⃣php扩展的概念和底层实现 2️⃣编写一个php扩展的步骤 3️⃣php底层,Zend 引擎...

  • php哈希冲突攻击解析

    一段攻击代码 插入结果 php5(5.2) php7 php 数组的实现 php 中的数组是 php 中非常好用的...

  • ArrayList

    基本使用 问题 Q:ArrayList底层实现是什么?A:底层实现是数组,ArrayList内部定义了一个数组来存...

  • ArrayList和LinkedList的区别

    ArrayList底层由数组实现,LinkedList底层由链表实现。 通常来说:ArrayList在随机访问元素...

  • ArrayList和LinkedList底层

    ArrayList底层实现是数组object,而LinkedList底层实现是双向链表(JDK1.7开始)。 故A...

  • php基础精粹

    PHP php数组 php数组之索引数组初始化 PHP数组之索引数组赋值 PHP数组之访问索引数组内容 PHP数组...

网友评论

      本文标题:php数组底层实现

      本文链接:https://www.haomeiwen.com/subject/ivwhqctx.html