這篇文章主要介紹了關於淺談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中元素的個數(即新產生的數組的長度)
以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!