Home  >  Article  >  Backend Development  >  A brief discussion of PHP source code 8: Introduction to array_pop, array_shift

A brief discussion of PHP source code 8: Introduction to array_pop, array_shift

不言
不言Original
2018-06-28 16:55:012019browse

This article mainly introduces the introduction of PHP source code 8: about array_pop and array_shift. It has a certain reference value. Now I share it with you. Friends in need can refer to it.

It’s the Chinese New Year. , it’s time for a holiday, some things need to be wrapped up, and some people are getting ready to go home,
It’s the first time this year that I haven’t gone home. . . . .

It seems that I haven’t looked at the relevant source code for a week. Are you no longer motivated?
It seems that I can't relax my requirements for some reasons, so I bought two more books. I just finished reading one of the books I bought last month. I have to work hard! . .

Looks like I said some nonsense. . .

In standard/array.c we can find the C implementation of the two functions array_pop and array_shift

mixed array_pop (array &array)

array_pop() pops and returns array The last element of the array and decrements the length of array by one. If array is empty (or not an array), NULL will be returned

Note: The array pointer will be reset (reset()) after using this function

mixed array_shift (array &array)

array_shift() Shifts the first element of the array out and returns it as the result, decrements the length of the array by one and shifts all other elements forward one position. All numeric key names will be changed to count from zero, and text key names will remain unchanged. If array is empty (or is not an array), NULL is returned.

Note: After using this function, the array pointer will be reset (reset())

Both functions are used in implementation

   /* {{{ 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);}

The program first determines the input , and then determine whether there are elements in the array. If the array is empty, return directly.
If it is array_pop:
==>zend_hash_internal_pointer_end
==>zend_hash_internal_pointer_end_ex(ht, NULL)
Directly at this time Return the last element of the doubly linked list in the hashtable ht->pInternalPointer = ht->pListTail;

If it is array_shift:
==>zend_hash_internal_pointer_reset(Z_ARRVAL_PP(stack));
= =>zend_hash_internal_pointer_reset_ex(ht, NULL)
At this time, the first element of the doubly linked list in the hashtable is returned directly ht->pInternalPointer = ht->pListHead;

Get the return value through

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

Get the value in the hashtable
Then delete the key value in the hashtable and call zend_hash_internal_pointer_reset to reset the hashtable
This reset is: ht->pInternalPointer = ht->pListHead;
That is, set the current position to the first element of the linked list.

The above is the entire content of this article. I hope it will be helpful to everyone's study. For more related content, please pay attention to the PHP Chinese website!

Related recommendations:

A brief discussion on PHP source code 7: About nl2br, ltrim, rtrim, trim functions

A brief discussion PHP source code six: About the stream_get_wrappers function

A brief discussion on PHP source code five: About the creation of array array

The above is the detailed content of A brief discussion of PHP source code 8: Introduction to array_pop, array_shift. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn