摘要:對(duì)于函數(shù),實(shí)現(xiàn)時(shí)新建一個(gè)哈希表,將需要插入的數(shù)據(jù)先插入到中,然后再把原來的數(shù)組數(shù)據(jù)寫入到中,這樣實(shí)現(xiàn)在數(shù)組前面插入數(shù)據(jù)元素的功能。這次閱讀源碼過程中,同時(shí)也研究了中的哈希表數(shù)據(jù)結(jié)構(gòu)及一些,也給自己補(bǔ)充了一些哈希表的知識(shí)。
在PHP中,在數(shù)組中添加元素也是一種很常用的操作,分別有在數(shù)組尾部和頭部添加元素,看看PHP內(nèi)部是如何實(shí)現(xiàn)數(shù)組插入的操作。
我在github有對(duì)PHP源碼更詳細(xì)的注解。感興趣的可以圍觀一下,給個(gè)star。PHP5.4源碼注解??梢酝ㄟ^commit記錄查看已添加的注解。
array_pushint array_push ( array &$array , mixed $value1 [ , mixed $... ] )
array_push函數(shù)將array參數(shù)看做一個(gè)棧,將傳遞進(jìn)來的變量壓倒array的尾部。array的長度隨著被壓進(jìn)去的變量個(gè)數(shù)增加。下面的代碼有意義的效果:
$array[] = $var;
如果只需要添加一個(gè)元素到數(shù)組,使用$array[] 這種方式更好,因?yàn)檫@樣做不用調(diào)用函數(shù)。
運(yùn)行示例$arr = array(); array_push($arr, 1, 2, 3); // return 3; $arr = [1, 2, 3]運(yùn)行步驟
array_push函數(shù)相對(duì)比較簡單,就相當(dāng)于壓棧操作,把a(bǔ)rray看做一個(gè)棧,然后對(duì)每一個(gè)參數(shù),讓其變成引用,引用數(shù)加一,然后添加它到數(shù)組的尾部。
內(nèi)部實(shí)現(xiàn)的流程圖如下:
源碼解讀添加元素使用了zend_hash_next_index_insert函數(shù),此函數(shù)是_zend_hash_next_index_insert函數(shù)的宏定義,這個(gè)函數(shù)是PHP內(nèi)部實(shí)現(xiàn)數(shù)組的數(shù)據(jù)結(jié)構(gòu)--哈希表包含的一些API,這個(gè)API用于追加元素到哈希表或者更新哈希表中已有的哈希值。此函數(shù)實(shí)現(xiàn)的流程圖如下:
array_unshiftint arrat_unshift ( array &$array , mixed $value1 [ , mixed $... ] )
array_unshift函數(shù)將數(shù)據(jù)元素插入到數(shù)組的頭部,插入時(shí)是作為整體插入,因此后面的參數(shù)將保持同樣的順序。插入后所有的數(shù)值鍵名將修改為從零開始計(jì)數(shù),所有的文字鍵名不變。
運(yùn)行示例$arr = array(1, 2, 3); array_unshift($arr, 4, 5, 6); // 4 5 6 1 2 3運(yùn)行步驟
源碼解讀1、調(diào)用php_splice將數(shù)據(jù)元素插入到數(shù)組頭部,用新的哈希表替換就得哈希表并將其銷毀
2、如果操作后的stack等于運(yùn)行時(shí)的符號(hào)表,則重置哈希表的內(nèi)部指針
3、stack指向新的哈希表,釋放新的哈希表紅箭,銷毀就得哈希表
由上面的步驟可知,array_unshift的核心步驟是php_splice函數(shù)。對(duì)于array_unshift函數(shù),php_splice實(shí)現(xiàn)時(shí)新建一個(gè)哈希表out_hash,將需要插入的list數(shù)據(jù)先插入到out_hash中,然后再把原來的數(shù)組數(shù)據(jù)寫入到out_hash中,這樣實(shí)現(xiàn)在數(shù)組前面插入數(shù)據(jù)元素的功能。
實(shí)現(xiàn)的效果圖如下:
小結(jié)要理解array_push函數(shù)的執(zhí)行過程主要理解棧的思想即可,而array_unshift則是新建一個(gè)數(shù)組,然后將兩數(shù)組合并為結(jié)果數(shù)組。
這次閱讀源碼過程中,同時(shí)也研究了PHP中的哈希表數(shù)據(jù)結(jié)構(gòu)及一些API,也給自己補(bǔ)充了一些哈希表的知識(shí)。學(xué)習(xí)到了PHP底層是使用雙向鏈表做哈希沖突的處理,獲益匪淺。日后再做關(guān)于PHP數(shù)據(jù)結(jié)構(gòu)的分享。
原創(chuàng)文章,文筆有限,才疏學(xué)淺,文中若有不正之處,萬望告知。
如果本文對(duì)你有幫助,點(diǎn)收藏的同時(shí)也請(qǐng)點(diǎn)下推薦吧,謝謝^_^
我在github有對(duì)PHP源碼更詳細(xì)的注解。感興趣的可以圍觀一下,給個(gè)star。PHP5.4源碼注解。可以通過commit記錄查看已添加的注解。
更多源碼文章,歡迎訪問個(gè)人主頁繼續(xù)查看:hoohack
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/21620.html
摘要:概述我們知道,在編程語言中,數(shù)組的使用頻率是很高的,幾乎每個(gè)腳本都會(huì)使用到。循環(huán)缺點(diǎn)遍歷完成之后,不能對(duì)數(shù)組進(jìn)行第二次遍歷數(shù)組內(nèi)部指針指向了最后一個(gè)元素。 概述 我們知道,在 PHP 編程語言中,數(shù)組的使用頻率是很高的,幾乎每個(gè)腳本都會(huì)使用到。 PHP 自帶了大量的、優(yōu)秀的操作數(shù)組的函數(shù)以供我們使用,本文就對(duì)這些數(shù)組函數(shù)的使用做一些分類和總結(jié),方便大家以后查閱。 創(chuàng)建 1. range...
摘要:語法數(shù)組刪除數(shù)組的最后一項(xiàng)語法數(shù)組在數(shù)組的最末添加一項(xiàng)語法數(shù)組刪除數(shù)組的首項(xiàng)語法數(shù)組在數(shù)組的首部添加一項(xiàng)案例分析 1:數(shù)組的指針操作: 語法:current(數(shù)組) 當(dāng)前指針指向的單元值(默認(rèn)是第零個(gè))語法 next(數(shù)組) 當(dāng)前指針往下移動(dòng)一幀語法 prev(數(shù)組) 當(dāng)前指針往前移動(dòng)一個(gè)指針語法 end(array) 將當(dāng)前指針移動(dòng)到最后一項(xiàng)語法 ...
摘要:像其他變量一樣,使用運(yùn)算符可以改變數(shù)組元素的內(nèi)容。數(shù)組的基本操作定義數(shù)組在中聲明數(shù)組的方式主要有兩種用函數(shù)聲明數(shù)組,直接為數(shù)組元素賦值。 概述 要訪問一個(gè)變量的內(nèi)容,可以直接使用其名稱。如果該變量是一個(gè)數(shù)組,可以使用變量名稱和關(guān)鍵字或索引的組合來訪問其內(nèi)容。 像其他變量一樣,使用運(yùn)算符=可以改變數(shù)組元素的內(nèi)容。數(shù)組單元可以通過 array[key] 語法來訪問。 showImg(...
摘要:下面的列表是最常用的前個(gè)函數(shù)它們是最常用的中自帶的函數(shù)。這些函數(shù)被命名使用,并從到進(jìn)行排序。排行函數(shù)頻率平均值前分析最常用的函數(shù)是字符串函數(shù),然后是數(shù)組函數(shù),接著是文件函數(shù)。以上個(gè)函數(shù)沒有近期要廢棄的計(jì)劃。是最常用的加密函數(shù),其次是。 showImg(https://segmentfault.com/img/remote/1460000018674936?w=600&h=293); 下...
摘要:數(shù)據(jù)結(jié)構(gòu)常見數(shù)據(jù)結(jié)構(gòu)數(shù)組是最簡單而且應(yīng)用最廣泛的數(shù)據(jù)結(jié)構(gòu)特征使用連續(xù)內(nèi)存空間來存儲(chǔ)存放相同類型或著衍生類型的元素?cái)?shù)組比較特別,可以存放八種數(shù)據(jù)類型通過下標(biāo)來訪問集合特征保存不重復(fù)的元素字典特征就是關(guān)聯(lián)數(shù)組,以形式存儲(chǔ)棧,與隊(duì)列相似特征存儲(chǔ)數(shù) 數(shù)據(jù)結(jié)構(gòu) 常見數(shù)據(jù)結(jié)構(gòu) Array 數(shù)組是 最簡單 而且 應(yīng)用最廣泛 的數(shù)據(jù)結(jié)構(gòu) 特征: 1、使用連續(xù)內(nèi)存空間來存儲(chǔ) 2、存放相同類型或著衍生類型...
閱讀 1251·2021-09-26 09:55
閱讀 3248·2019-08-30 15:55
閱讀 999·2019-08-30 15:53
閱讀 2315·2019-08-30 13:59
閱讀 2402·2019-08-29 13:08
閱讀 1127·2019-08-29 12:19
閱讀 3338·2019-08-26 13:41
閱讀 435·2019-08-26 13:24