搜尋
首頁後端開發PHP問題PHP數組的底層實作原理是什麼?

PHP數組的底層實作原理是什麼?

Jul 01, 2020 pm 04:03 PM
php底層陣列

PHP數組的底層實作原理是:1、哈希表,將不同的關鍵字映射到不同單元的一種資料結構;2、鍊錶,就是由不同的鍊錶節點組成的一種數據結構;3、php數組,使用鏈結法解決哈希衝突的方式。

PHP數組的底層實作原理是什麼?

一、哈希表

#哈希表,顧名思義,即將不同的關鍵字映射到不同單元的一種資料結構。而將不同關鍵字映射到不同單元的方法就叫做哈希函數

理想情況下,經過哈希函數處理,關鍵字和單元是會進行一一對應的;但是如果關鍵字值足夠多的情況下,就容易出現多個關鍵字映射到同一單元的情況,即出現哈希衝突

哈希衝突的解決方案,要么使用鏈接法,要么使用開放尋址法

連結法

即當不同的關鍵字對應到同一單元時,在同一單元內使用鍊錶來儲存這些關鍵字

#開放尋址法

即當插入資料時,如果發現關鍵字被映射到的單元存在資料了,表示發生了衝突,就繼續尋找下一個單元,直到找到可用單元為止

而因為開放尋址法方案屬於佔用其他關鍵字映射單元的位置,所以後續的關鍵字更容易出現哈希衝突,因此容易出現效能下降

二、鍊錶

既然上面提到了鍊錶,這裡我們簡單聊聊鍊錶的基礎知識。鍊錶分為很多種類型,常用的資料結構包括:佇列,棧,雙向鍊錶等

鍊錶,就是由不同的鍊錶節點組成的一種資料結構。鍊錶節點一般由元素 指向下一節點的指標組成。而雙向鍊錶,顧名思義,則是由指向上一節點的指標元素指向下一節點的指標組成

對於資料結構的內容,我們不過多展開,我們之後會有專門的內容去詳細介紹資料結構

三、php數組

php解決哈希衝突的方式是使用了連結法,所以php數組是由哈希錶鍊錶實現,準確來說,是由雜湊表雙向鍊錶實作

四、內部結構-雜湊表

HashTable结构体主要用来存放哈希表的基本信息
typedef struct _hashtable { 
    uint nTableSize;        // hash Bucket的大小,即哈希表的容量,最小为8,以2x增长。
    uint nTableMask;        // nTableSize-1 , 索引取值的优化
    uint nNumOfElements;    // hash Bucket中当前存在的元素个数,count()函数会直接返回此值 
    ulong nNextFreeElement; // 下一个可使用的数字键值
    Bucket *pInternalPointer;   // 当前遍历的指针(foreach比for快的原因之一)
    Bucket *pListHead;          // 存储整个哈希表的头元素指针
    Bucket *pListTail;          // 存储整个哈希表的尾元素指针
    Bucket **arBuckets;         // 存储hash数组
    dtor_func_t pDestructor;    // 在删除元素时执行的回调函数,用于资源的释放
    zend_bool persistent;       //指出了Bucket内存分配的方式。如果persisient为TRUE,则使用操作系统本身的内存分配函数为Bucket分配内存,否则使用PHP的内存分配函数。
    unsigned char nApplyCount; // 标记当前hash Bucket被递归访问的次数(防止多次递归)
    zend_bool bApplyProtection;// 标记当前hash桶允许不允许多次访问,不允许时,最多只能递归3次
#if ZEND_DEBUG
    int inconsistent;
#endif
} HashTable;

Bucket結構體則用來保存資料的具體內容

typedef struct bucket {
    ulong h;            // 对char *key进行hash后的值,或者是用户指定的数字索引值
    uint nKeyLength;    // hash关键字的长度,如果数组索引为数字,此值为0
    void *pData;        // 指向value,一般是用户数据的副本,如果是指针数据,则指向pDataPtr
    void *pDataPtr;     // 如果是指针数据,此值会指向真正的value,同时上面pData会指向此值
    struct bucket *pListNext;   // 指向整个哈希表的该单元的下一个元素
    struct bucket *pListLast;   // 指向整个哈希表的该单元的上一个元素
    struct bucket *pNext;       // 指向由于哈希冲突导致存放在同一个单元的链表中的下一个元素
    struct bucket *pLast;       // 指向由于哈希冲突导致存放在同一个单元的链表中的上一个元素
    // 保存当前值所对于的key字符串,这个字段只能定义在最后,实现变长结构体
    char arKey[1];              
} Bucket;

相關學習推薦:PHP程式設計從入門到精通

#

以上是PHP數組的底層實作原理是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具