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

來源:互聯網
上載者:User
這篇文章主要介紹了關於淺談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!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.