广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP数组是如何灵活支持多数据类型的
  • 881
分享到

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

2023-07-05 16:07:13 881人浏览 泡泡鱼
摘要

本文小编为大家详细介绍“PHP数组是如何灵活支持多数据类型的”,内容详细,步骤清晰,细节处理妥当,希望这篇“php数组是如何灵活支持多数据类型的”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。在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数组是如何灵活支持多数据类型的”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网PHP编程频道。

--结束END--

本文标题: PHP数组是如何灵活支持多数据类型的

本文链接: https://www.lsjlt.com/news/353415.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • PHP数组是如何灵活支持多数据类型的
    本文小编为大家详细介绍“PHP数组是如何灵活支持多数据类型的”,内容详细,步骤清晰,细节处理妥当,希望这篇“PHP数组是如何灵活支持多数据类型的”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。在PHP中,数组数据结...
    99+
    2023-07-05
  • MySQL支持多少组数据类型?
    MySQL 使用许多不同的数据类型,分为三类 -数字日期和时间字符串类型数字数据类型MySQL 使用所有标准 ANSI SQL 数字数据类型,因此如果您从不同的数据库系统访问 MySQL,这些定义对您来说会很熟悉。 p>以下列表显示了常见的...
    99+
    2023-10-22
  • PHP 中支持存储哪些数据类型,包括 NumPy 数组?
    PHP 是一门非常流行的编程语言,它支持多种数据类型。在 PHP 中,我们可以使用不同的数据类型来存储不同类型的数据。在本文中,我们将介绍 PHP 中支持的数据类型,并探讨如何使用 NumPy 数组。 PHP 中的数据类型 PHP 支持以...
    99+
    2023-10-02
    数据类型 存储 numpy
  • C语言数据类型是如何被大多数计算机系统所支持
    今天就跟大家聊聊有关C语言数据类型是如何被大多数计算机系统所支持,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。问题:在读K&R版的The C Programming Lang...
    99+
    2023-06-17
  • GO语言中的数据类型是否支持缓存?
    Go语言是一种静态类型、编译型的语言,它的数据类型支持缓存。缓存是指将一部分数据临时保存在计算机的内存中,以便快速访问。在Go语言中,缓存是通过使用内置的map类型来实现的。 Map是Go语言中的一种关联数组,它将键映射到值。在Go语言中...
    99+
    2023-11-13
    数据类型 缓存 javascript
  • ASP和npm:哪一个提供更好的数据类型和数组支持?
    在Web开发中,ASP和npm是两个常用的框架,它们都提供了丰富的功能和工具,使得Web开发变得更加高效和便捷。其中,数据类型和数组支持是Web开发中非常重要的一部分,那么ASP和npm哪一个提供更好的数据类型和数组支持呢?本文将从数据类...
    99+
    2023-08-15
    npm 数组 数据类型
  • 如何在ASP API中使用多种数据类型来提高应用程序的灵活性?
    ASP.NET Web API是一种非常流行的Web服务框架,它允许开发人员使用多种不同的数据类型来构建灵活的应用程序。在本文中,我们将讨论如何在ASP.NET Web API中使用多种数据类型来提高应用程序的灵活性。 一、使用简单数据类...
    99+
    2023-07-28
    api 并发 数据类型
  • Java中的数据类型是否支持大数据处理和异步编程?
    Java是一种广泛使用的编程语言,它在软件开发领域中占据着重要的地位。在处理大数据和异步编程方面,Java的数据类型和相关库是否能够胜任呢?本篇文章将从这两个方面展开讨论。 Java中的数据类型是否支持大数据处理? 在Java中,常见的数据...
    99+
    2023-07-06
    大数据 异步编程 数据类型
  • Java中的索引数据类型如何支持响应式编程?
    在编程中,我们常常需要对一些数据进行索引操作,以便于快速查找和获取数据。在Java中,我们可以使用索引数据类型来实现这个功能。而响应式编程则是一种编程模型,通过对数据流进行观察和响应,可以有效地处理异步事件和数据流。本文将介绍Java中的...
    99+
    2023-09-09
    响应 索引 数据类型
  • php如何将json数据转化为数组类型
    这篇文章主要讲解了“php如何将json数据转化为数组类型”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php如何将json数据转化为数组类型”吧!在php中,可以利用json_decode...
    99+
    2023-06-22
  • Python 中可用的 API 能否支持数据类型的 load?如何实现?
    Python 是一种非常流行的编程语言,由于其易学易用的特性,已经成为了数据科学领域中的一种主流语言。在 Python 中,API 是一种非常重要的概念,它可以帮助开发人员更快地完成任务。而在 Python 中,API 的一个重要功能就是支...
    99+
    2023-07-21
    load 数据类型 api
  • PHP 中的数据类型是否能够存储 NumPy 数组?
    PHP 是一种非常流行的编程语言,它被广泛应用于 Web 开发领域。而 NumPy 是 Python 中的一个非常重要的科学计算库,它主要用于处理数组和矩阵等数值计算。那么,PHP 中的数据类型是否能够存储 NumPy 数组呢?本文将对此问...
    99+
    2023-10-02
    数据类型 存储 numpy
  • GO框架中的数据类型是否足够支持自然语言处理?
    GO是一种现代化的编程语言,它在Web应用程序开发中广受欢迎。在Go语言的生态系统中,框架是开发人员用来加速Web应用程序开发的重要工具。然而,当涉及到自然语言处理(NLP)时,人们开始怀疑Go框架中的数据类型是否足够支持。 在本文中,我们...
    99+
    2023-09-26
    框架 数据类型 自然语言处理
  • 如何在PHP和Apache服务器中使用多维数组和不同的数据类型?
    在PHP和Apache服务器中,多维数组和不同的数据类型是必不可少的。多维数组可以帮助我们更有效地组织和处理数据,而不同的数据类型则可以让我们更加灵活地处理不同类型的数据。在这篇文章中,我们将深入探讨如何在PHP和Apache服务器中使用多...
    99+
    2023-09-15
    apache 数组 数据类型
  • PHP中Apache服务器如何处理数组和数据类型?
    在PHP中,数组和数据类型是非常重要的概念。Apache服务器作为PHP的一种服务器环境,也对这些概念进行了相应的处理。本文将会介绍如何在Apache服务器中处理数组和数据类型。 一、PHP中的数组 数组是PHP中最常用的数据结构之一。在...
    99+
    2023-09-15
    apache 数组 数据类型
  • Apache服务器中如何使用PHP数组和数据类型?
    PHP是一种在Web开发中广泛使用的编程语言,它拥有许多有用的功能,其中包括数组和数据类型。在Apache服务器中使用PHP数组和数据类型可以让你更轻松地处理数据和管理服务器。 本文将介绍如何在Apache服务器中使用PHP数组和数据类型...
    99+
    2023-09-15
    apache 数组 数据类型
  • 如何在Laravel中使用Python的数据类型数组?
    Laravel是一个流行的PHP框架,它提供了许多功能强大的工具和库,使得开发Web应用程序变得更加容易。Python作为一种流行的编程语言,也拥有强大的数据类型和库。在本文中,我们将讨论如何在Laravel中使用Python的数据类型数组...
    99+
    2023-10-20
    数据类型 数组 laravel
  • 如何在MongoDB中实现数据的多语言支持功能
    如何在MongoDB中实现数据的多语言支持功能摘要:随着全球化的发展,越来越多的应用程序需要支持多语言功能。本文将介绍如何在MongoDB中实现数据的多语言支持功能,包括数据结构设计、数据存储和数据查询等方面。同时,为了更好地理解和实操本文...
    99+
    2023-10-22
    MongoDB 多语言支持
  • PHP接口数据类型详解:如何应对各种数据类型的挑战?
    PHP是一种广泛使用的编程语言,特别是在Web开发领域中。在Web开发的过程中,我们经常需要使用接口来获取数据。然而,不同的数据类型可能会对接口带来不同的挑战。在本文中,我们将详细介绍PHP接口数据类型,并提供相应的演示代码,以帮助您更好地...
    99+
    2023-06-01
    接口 学习笔记 数据类型
  • 数据库类型是如何划分的
    这篇文章主要介绍了数据库类型是如何划分的,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。数据库类型是按照数据模型来划分的,数据模型(Data Mo...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作