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