PHP核心之旅 5 強大的陣列

2022-01-10 09:54:46 字數 2294 閱讀 8549

php 核心之旅系列

php核心之旅-1.生命週期

php核心之旅-2.sapi中的cli

php核心之旅-3.變數

php核心之旅-4.字串

php核心之旅-5.強大的陣列

php核心之旅-6.垃圾**機制

1.底層實現為雜湊表(hashtable,也稱作雜湊表)

2.雜湊表的概念:

是根據關鍵碼值(key value)而直接進行訪問的資料結構。通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。複雜度為o(1)。

檔案路徑\zend\zend_types.h

_zend_array結構:

1 typedef struct

_zend_array zend_array;

2 typedef struct

_zend_array hashtable;34

struct

_zend_array v;

14uint32_t flags;

15} u;

16uint32_t ntablemask;

17 bucket *ardata;

18uint32_t nnumused;

19uint32_t nnumofelements;

20uint32_t ntablesize;

21uint32_t ninternalpointer;

22zend_long nnextfreeelement;

23dtor_func_t pdestructor;

24 };

zend_array和hashtable結構相同 

ardata:雜湊表中儲存儲存元素的陣列,其記憶體是連續的,ardata指向陣列的起始位置,其記憶體連續。

ntablesize:陣列的總容量,可以容納的元素數,大小是2的冪次方,最小為8

ntablemask: 對映元素的儲存位置用到,ntablesize的負數

nnumused: 陣列當前使用的bucket數,刪除元素時,不會將其從陣列中移除,將這個元素的型別標為is_undef,當陣列容量超限,擴容時才會刪除。

nnumofelements:陣列中有效元素的位置

nnextfreeelement:下乙個數值的索引

pdestructor:刪除或覆蓋陣列中的某個元素時,則呼叫此函式對舊元素進行處理

u:輔助作用

bucket結構:

1

typedef struct _bucket bucket;

val: 具體的value

h: key的hash值,或者數值索引

*key: 儲存元素的key,如果元素是數值索引則為null

雜湊函式:將元素進行hash運算後的值,對陣列大小取模之後的值(下標:0~7)分配到中間對映表

中間對映表:元素和下標的對映關係表。可以通過ardata向前訪問到

元素陣列:實際儲存元素的陣列,按照下標有序儲存元素

\zend\zend_hash.c

1 zend_api void zend_fastcall _zend_hash_init(hashtable *ht, uint32_t nsize, dtor_func_t pdestructor,zend_bool persistent zend_file_line_dc)

2

\zend\zend_api.c

1 zend_api int _array_init(zval *arg, uint32_t size zend_file_line_dc) /*

插入時首先會檢查陣列已經分配儲存空間,初始化時沒有實際分配ardata的記憶體,第一次插入時才會根據ntablesize的大小分配,分配完以後會把hashtable->u.flags打上hash_flag_initialized掩碼,下次插入時發現已經分配了就不會再重複操作。

1

static zend_always_inline void zend_hash_check_init(hashtable *ht,int packed)27

}89#

define check_init(ht, packed) \

10 zend_hash_check_init(ht, packed)

php學習之旅 5 迴圈

php學習之旅 5 迴圈 1 語法 while 迴圈直到特定條件滿足 do.while 執行一次 並且迴圈,直到滿足特定條件 for 迴圈指定的次數 foreach 對陣列中的每個元素都迴圈一遍 2 while i 1 while i 5 輸出the number is 1 the number i...

php學習之旅 4 陣列

php學習之旅 4 陣列 1 陣列種類 數值索引陣列 具有數值索引的陣列 多維陣列 包含乙個或多個陣列的陣列 2 數值索引陣列 第一種初始化方法 cars array saab volvo bmw toyota 第二種初始化方法 cars 0 saab cars 1 volvo cars 2 bmw...

PHP 入門 5 陣列

排序陣列函式 注 php 內部將所有的陣列都儲存為關聯陣列。向乙個已存在的索引陣列末尾新增更多的值,可以使用語法。family array fred wilma family pebbles family 2 是 pebbles 如果該陣列為關聯陣列,則新增的索引為 0 family array n...