首頁  >  文章  >  後端開發  >  淺談PHP源碼九:關於array_unshift, array_push的介紹

淺談PHP源碼九:關於array_unshift, array_push的介紹

不言
不言原創
2018-06-28 16:58:532179瀏覽

這篇文章主要介紹了關於淺談PHP源碼九:關於array_unshift, array_push的介紹,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

#今天過年了,祝各位朋友新春快樂,萬事如意!

淺談PHP原始碼九:關於array_unshift, array_push的介紹

int array_unshift ( array &array, mixed var [, mixed ...] )

array_unshift() 將傳入的單元插入到array 陣列的開頭。注意單元是作為整體被插入的,因此傳入單元將保持相同的順序。所有的數值鍵名將修改為從零開始重新計數,所有的文字鍵名保持不變。

傳回 array 陣列新的單元數目。

在standard/array.c的2080行,可以看到此函數的C實作PHP_FUNCTION(array_unshift)

程式會先判斷輸入參數的數量是否正確,若小於2則報錯
接著判斷第一個參數是否為數組,如果不是,報錯退出
然後程式會呼叫new_hash = php_splice(Z_ARRVAL_P(stack), 0, 0, &args[1], argc-1, NULL) ;

HashTable* php_splice(HashTable *in_hash, int offset, int length, zval ***list, int list_count, HashTable **removed)
此函數在array.c的1861行
它會先將in_hash(原來的hashtable)複製一部分到新的hashtable,這裡的一部分是根據所給的offset和length來計算,array_unshif所給的offset和length都為0,所以這裡不複製任何元素給新的hashtable
然後遍歷list,針對每個元素分別創建一個zval並使用zend_hash_next_index_insert插入到新的hashtable
然後將in_hash中剩餘的元素複製給新的hashtable,我們這裡由於offset和length都為0 ,所以是全部的hashtable
最後,返回新生成的hashtable
整個過程就相當於先把list中的資料寫入hashtable,然後把舊的資料寫入hashtable,這樣就實現了在數組前面插入元素

然後刪除舊的數組所在的hashtable並刷新新HashTable,並重置hashtable的內部指針,
返回hashtable中元素的個數(即新生成的數組的長度)

int array_push ( array &array, mixed var [, mixed ...] )

array_push() 將array 當成一個堆疊,並將傳入的變數壓入array 的末端。 array 的長度將根據入棧變數的數目增加。
和如下效果相同:

   <?php$array[] = $var;?>

並對每個 var 重複以上動作。

傳回數組新的單元總數。

這個實作就比較簡單了:
直接遍歷所給的參數,對每個元素建立一個zval,並使其引用加一,加到陣列所在hashtable的後面。
返回hashtable中元素的個數(即新生成的數組的長度)

以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!

相關推薦:

淺談PHP源碼八:關於array_pop, array_shift的介紹

淺聊PHP源碼七:關於nl2br , ltrim, rtrim, trim函數

淺談PHP原始碼六:關於stream_get_wrappers函數

#

以上是淺談PHP源碼九:關於array_unshift, array_push的介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn