這篇文章主要介紹了關於淺談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;
即把當前的位置設定為鏈表的第一個元素。
以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!