首頁  >  文章  >  後端開發  >  淺談PHP源碼八:關於array_pop, array_shift的介紹

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

不言
不言原創
2018-06-28 16:55:012071瀏覽

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

#要過年了,要放假了,一些事情需要收尾了,有些人也準備回家了,
今年第一次沒有回家。 。 。 。 。

似乎也有一個星期沒有看相關的源碼了,是不是上進心沒有了?
看來不能因為某些原因放鬆對自己的要求,又買了兩本書,上個月買的書才看完了一本,要加油了! 。 。

似乎說了一些廢話。 。 。

在standard/array.c中我們可以找到array_pop, array_shift這2個函數的C實作

mixed array_pop ( array &array )

array_pop() 彈出並返回array 數組的最後一個單元,並將數組array 的長度減一。如果array 為空(或不是陣列)會傳回NULL

注意: 使用本函數後會重設(reset())陣列指標

mixed array_shift ( array &array )

#array_shift() 將array 的第一個單元移出並作為結果返回,將array 的長度減一並將所有其它單元向前移動一位。所有的數字鍵名將改為從零開始計數,文字鍵名將不變。如果 array 為空(或不是陣列),則傳回 NULL。

注意: 使用本函數後會重設(reset())陣列指標

這兩個函數在實作上都是使用的

   /* {{{ proto mixed array_pop(array stack)
   Pops an element off the end of the array */PHP_FUNCTION(array_pop){
 _phpi_pop(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);}/* }}} */ /* {{{ proto mixed array_shift(array stack)
   Pops an element off the beginning of the array */PHP_FUNCTION(array_shift){
 _phpi_pop(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);}

程式先判斷輸入,然後判斷數組中是否有元素,如果數組為空直接返回,
如果是array_pop:
==>zend_hash_internal_pointer_end
==>zend_hash_internal_pointer_end_ex(ht, NULL)
此時直接返回hashtable中雙向鍊錶的最後一個元素ht->pInternalPointer = ht->pListTail;

如果是array_shift:
==>zend_hash_internal_pointer_reset(Z_ARRVAL_PP(stack));
= =>zend_hash_internal_pointer_reset_ex(ht, NULL)
此時直接回傳hashtable中雙向鍊錶的第一個元素ht->pInternalPointer = ht->pListHead;

得到回傳值,透過

#
  zend_hash_get_current_data 
==> zend_hash_get_current_data_ex(ht, pData, NULL) 
 p = pos ? (*pos) : ht->pInternalPointer;*pData = p->pData;

取得hashtable中的值
然後刪除hashtable中的這個key值,並且呼叫zend_hash_internal_pointer_reset重置hashtable
這個重置就是:ht->pInternalPointer = ht->pListHead;##pListHead;##pListHead;##pListHead;##pListHead;##pListHead;##pListHead;##pListHead;##pListHead;##pListHead;##pListHead;##pListHead;##pListHead;##pListHead;##pList #即把目前的位置設定為鍊錶的第一個元素。

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

相關推薦:

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

# PHP原始碼六:關於stream_get_wrappers函數

淺聊PHP原始碼五:關於array 陣列的建立#

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

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