我的编程空间,编程开发者的网络收藏夹
学习永远不晚

PHP数组是如何灵活支持多数据类型的

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

PHP数组是如何灵活支持多数据类型的

本文小编为大家详细介绍“PHP数组是如何灵活支持多数据类型的”,内容详细,步骤清晰,细节处理妥当,希望这篇“PHP数组是如何灵活支持多数据类型的”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

在PHP中,数组数据结构的应用处理是使用频率非常高的,相对于Java、C++ 这种强类型语言来说,PHP的数组简直可以说是太好用了,可以存储各种类型的数据(如:数字、字符串甚至对象等),为开发带来了极大的便利。

基于 PHP 数组的强大特性,我们可以轻易实现更加复杂的数据结构,比如栈、队列、列表、集合、字典等。

PHP数组是如何灵活支持多数据类型的

你是否迫不及待的想要一探究竟:PHP到底是如何实现数组的呢?

1、PHP数组底层数据结构

PHP 数组其内部是使用 HashTable 结构来实现的,那就先来简单说说HashTable吧!

HashTable又称散列表,是通过key-value的方式来高效地访问数据的一种结构。哈希表是数组和链表的一种合并,集成了数组的寻址快,链表的插入快的特点于一身。

PHP数组是如何灵活支持多数据类型的

HashTable主要分为两个环节:

哈希函数:哈希函数将要查找的值转换成数字索引,通过数字索引可以快速的找到值存在的位置。

哈希碰撞:理想情况下,不同的值通过哈希函数后,出来的结果是不一样的;如果不一样的值,哈希后出来一样的数字,我们称之为哈希碰撞。

因此应用 HashTable 就必须要面临解决哈希碰撞的问题,主要的解法有两种:链表法,开放寻址法。

在zend_type.h文件中,可以找到 HashTable 的主要结构定义如下:

zend_数组 类型

挑选几个重点成员介绍一下:

  • gc: 引用计数,垃圾回收使用。

  • arData:散列表中保存存储元素的数组,其内存是连续的,arData指向数组的起始位置;

  • nTableSize:数组的总容量,即可以容纳的元素数,arData 的内存大小就是根据这个值确定的,它的大小的是2的幂次方,最小为8,然后按照 8、16、32...依次递增;

PHP数组是如何灵活支持多数据类型的

Bucket 类型

Bucket 的结构比较简单,主要用来保存元素的 key 和 value,以及一个整型的 h(散列值,或者叫哈希值)。

  • 如果元素是数值索引,则其值就是数值索引的值;

  • 如果是字符串索引,那么其值就是 key 通过 Time33 算法计算得到的散列值。

h 的值用来最终映射元素的存储位置。

PHP数组是如何灵活支持多数据类型的

2、PHP 数组的基本实现

上面部分我们了解了 zend_数组 的数据结构,那接着看看数组的初始化吧:

PHP数组是如何灵活支持多数据类型的

数组的初始化主要是针对 HashTable 成员的设置,初始化时并不会立即分配 arData 的内存,插入第一个元素之后才会分配 arData 的内存。

为了更好的理解整个hash结构,我们来举个例子说明一下这个结构:

$data = array(
   'hello' => 'haha',
   1       => 'me to'
   'world' => 'world',
   2       => 2
);
unset($data[1]);

那上面的hash结构应该是什么样的呢?arData存储的结果应该是什么样呢?

画个图例来看看吧,更直观一些:

PHP数组是如何灵活支持多数据类型的

arData是Bucket类型的指针,用来具体存储每个元素的key,value,按照插入元素的顺序存储数据的,所以数组的顺序也是靠这个来保证。

每个arData数组的元素,从图中可以看到,左边负数是哈希值取模后的值,存储的是右边arData的索引;如-8冲突了,则存储了链表的头元素。

arData[0]: key='hello',h=xx(具体某个值),val = 'haha'

arData[1]: val是 type=IS_UNDEF 的zval(被unset后,不是立即被删除,而是置成IS_UNDEF)

arData[2]: key='world',h=xx(具体某个值),val = 'world'

arData[3]: key=NULL,h=2(可能会哈希值冲突),val = 2

….

上面的例子很具体地解释了nNumUsed,nNumOfElements,arData的意义。

3、PHP 数组的有序性

数组中各元素的顺序和插入顺序一致,这个是怎么实现的呢?

为了实现 PHP 数组的有序性,PHP 底层的散列表在散列函数与元素数组之间加了一层映射表,这个映射表也是一个数组,大小和存储元素的数组相同,存储元素的类型为整型,用于保存元素在实际存储的有序数组中的下标 —— 元素按照先后顺序依次插入实际存储数组,然后将其数组下标按照散列函数散列出来的位置存储在新加的映射表中

这样,就可以完成最终存储数据的有序性了。

PHP 数组底层结构中并没有显式标识这个中间映射表,而是与 arData 放到了一起,在数组初始化的时候并不仅仅分配用于存储 Bucket 的内存,还会分配相同数量的 uint32_t 大小的空间,这两块空间是一起分配的,然后将 arData 偏移到存储元素数组的位置,而这个中间映射表就可以通过 arData 向前访问到。

读到这里,这篇“PHP数组是如何灵活支持多数据类型的”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

PHP数组是如何灵活支持多数据类型的

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

PHP数组是如何灵活支持多数据类型的

本文小编为大家详细介绍“PHP数组是如何灵活支持多数据类型的”,内容详细,步骤清晰,细节处理妥当,希望这篇“PHP数组是如何灵活支持多数据类型的”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。在PHP中,数组数据结
2023-07-05

MySQL支持多少组数据类型?

MySQL 使用许多不同的数据类型,分为三类 -数字日期和时间字符串类型数字数据类型MySQL 使用所有标准 ANSI SQL 数字数据类型,因此如果您从不同的数据库系统访问 MySQL,这些定义对您来说会很熟悉。 p>以下列表显示了常见的
2023-10-22

C语言数据类型是如何被大多数计算机系统所支持

今天就跟大家聊聊有关C语言数据类型是如何被大多数计算机系统所支持,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。问题:在读K&R版的The C Programming Language
2023-06-17

Teradata如何支持多种数据格式和数据类型的存储与查询

Teradata支持多种数据格式和数据类型的存储与查询,包括结构化数据和非结构化数据。Teradata提供了多种数据类型用于存储不同类型的数据,例如整数、浮点数、字符串、日期时间等。此外,Teradata还支持嵌套数据类型,如数组、结构体、
Teradata如何支持多种数据格式和数据类型的存储与查询
2024-04-09

MyBatis视图设计如何支持数据备份恢复的灵活性扩展

MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。当我们谈论视图设计时,我们实际上是在讨论如何在数据库中创建虚拟表,这些表是基于其他表的查询结果。视图的设计对于数据备份和恢复的灵活性扩展来说是非常重要的。
MyBatis视图设计如何支持数据备份恢复的灵活性扩展
2024-10-15

PHP中如何查询数组中的数据类型

标题:PHP中查询数组中的数据类型及具体实现方法在PHP中,数组是一种非常常用的数据结构,用于存储多个相关元素。有时候我们需要查询数组中元素的数据类型,以便进行进一步的处理或者验证。在本文中,将介绍如何使用PHP查询数组中元素的数据类型,
PHP中如何查询数组中的数据类型
2024-03-14

php如何将json数据转化为数组类型

这篇文章主要讲解了“php如何将json数据转化为数组类型”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php如何将json数据转化为数组类型”吧!在php中,可以利用json_decode
2023-06-22

HBase的架构如何支持数据多副本

HBase的架构通过其独特的数据复制和冗余存储机制,有效地支持了数据的多副本存储,从而确保了数据的高可用性和容错性。以下是HBase架构如何支持数据多副本的详细说明:HBase的数据分布和存储HBase使用Region的概念,将数据划分
HBase的架构如何支持数据多副本
2024-10-19

Couchbase是如何支持JSON数据格式的

Couchbase支持JSON数据格式,提供对半结构化和非结构化数据的全面管理。它支持完整的JSON数据类型、通过API轻松操作文档、索引以优化查询性能、二级索引以查询嵌套数据、数据类型映射以优化存储和检索、地理空间支持以存储和查询地理数据、N1QL查询语言以进行灵活的数据检索,以及JSON文档事务以确保数据一致性。Couchbase的JSON支持为开发人员提供了灵活性和可扩展性、高性能、地理空间支持以及事务支持的优势。
Couchbase是如何支持JSON数据格式的
2024-04-13

Couchbase是如何支持JSON数据格式的

Couchbase支持JSON数据格式的主要方式是通过其灵活的数据模型和内置的JSON文档存储功能。Couchbase是一个面向文档的NoSQL数据库,其中数据以JSON文档的形式存储。用户可以直接将JSON文档存储在Couchbase中,
Couchbase是如何支持JSON数据格式的
2024-04-09

PHP如何返回所有支持的编码的数组

本文介绍了PHP返回所有支持编码的数组的三种方法:mb_list_encodings()返回所有支持的字符编码。iconv_get_encodings()返回字符编码的别名。array_unique()可删除重复编码。此外,PHP使用扩展名别名与编码关联。通过finfo_file()函数可获取特定扩展名的编码。
PHP如何返回所有支持的编码的数组
2024-04-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录