這篇文章主要介紹了關於淺談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源碼七:關於nl2br, ltrim, rtrim, trim函數
# PHP原始碼六:關於stream_get_wrappers函數
以上是淺談PHP源碼八:關於array_pop, array_shift的介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!