今天過年了,祝各位朋友新春快樂,萬事如意!
淺談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教程
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答