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結構:
1typedef 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掩碼,下次插入時發現已經分配了就不會再重複操作。
1static 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...