在PHP中,在數組中添加元素也是一種很常用的操作,分別有在數組尾部和頭部添加元素,看看PHP內部是如何實現數組插入的操作。
我在github有對PHP源碼更詳細的注解。感興趣的可以圍觀一下,給個star。PHP5.4源碼注解。可以通過commit記錄查看已添加的注解。
int 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看做一個棧,然後對每一個參數,讓其變成引用,引用數加一,然後添加它到數組的尾部。
內部實現的流程圖如下:
$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中,這樣實現在數組前面插入數據元素的功能。
實現的效果圖如下:
這次閱讀源碼過程中,同時也研究了PHP中的哈希表數據結構及一些API,也給自己補充了一些哈希表的知識。學習到了PHP底層是使用雙向鏈表做哈希沖突的處理,獲益匪淺。日後再做關於PHP數據結構的分享。
原創文章,文筆有限,才疏學淺,文中若有不正之處,萬望告知。
如果本文對你有幫助,請點下推薦吧,謝謝^_^
最後再安利一下,我在github有對PHP源碼更詳細的注解。感興趣的可以圍觀一下,給個star。PHP5.4源碼注解。可以通過commit記錄查看已添加的注解。
更多源碼文章,歡迎訪問個人主頁繼續查看:hoohack