php function array_shift() to delete the last element in the array

PHP中文网
Release: 2023-03-16 21:14:01
Original
1677 people have browsed it

Delete the first element (red) in the array and return the deleted element:

<?php
    $a=array("a"=>"red","b"=>"green","c"=>"blue");
    echo array_shift($a);print_r ($a);
?>
Copy after login

Definition and usage

array_shift() Function is used to delete the first element in the array and returns the deleted element.

Note: If the key name is numeric, all elements will get new key names, starting from 0 and increasing by 1 (see example below).

Syntax

array_shift(array)
Copy after login

Parameters Description

array Required. Specifies an array.

Technical details Return value:

Returns the value of removing elements from the array, or NULL if the array is empty.

Use numeric key name:

<?php
$a=array(0=>"red",1=>"green",2=>"blue");
echo array_shift($a);
print_r ($a);
?>
Copy after login

A large php array (1w+), when using array_shfit and array_pop to retrieve array elements, the performance gap is particularly large, array_shift is unbearably slow, and array_pop That's pretty quick.

Let’s not talk about the answer first, let’s look at the code:

$arr = array(    0=>123,    3=>132,    2=>987,);array_shift($arr);//array_pop($arr);var_dump($arr);
输出会有什么不同呢,
array_shift后,输出为:
array(2) {
  [0]=>
  int(132)
  [1]=>
  int(987)
}
array_pop后,输出为:
array(2) {
  [0]=>
  int(123)
  [3]=>
  int(132)
}
Copy after login

What’s the difference?

Yes, after the array_shift operation, the key value of the array has changed. This is why array_shift is slow. Because the array_shift operation array will rebuild the numeric key value from 0 again. Every time you remove an element, you have to iterate through all the elements in the array. array_pop will not. One is O(1) and the other is O(n) complexity. When the array is large, the effect becomes obvious.

C code implementation of the corresponding function in php:

/* {{{ void _phpi_pop(INTERNAL_FUNCTION_PARAMETERS, int off_the_end) */
static void _phpi_pop(INTERNAL_FUNCTION_PARAMETERS, int off_the_end)
{
zval *stack,/* Input stack */
 **val;/* Value to be popped */
char *key = NULL;
uint key_len = 0;
ulong index;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a", &stack) == FAILURE) {
return;
}
if (zend_hash_num_elements(Z_ARRVAL_P(stack)) == 0) {
return;
}
/* Get the first or last value and copy it into the return value */
if (off_the_end) {
zend_hash_internal_pointer_end(Z_ARRVAL_P(stack));
} else {
zend_hash_internal_pointer_reset(Z_ARRVAL_P(stack));
}
zend_hash_get_current_data(Z_ARRVAL_P(stack), (void **)&val);
RETVAL_ZVAL(*val, 1, 0);
/* Delete the first or last value */
zend_hash_get_current_key_ex(Z_ARRVAL_P(stack), &key, &key_len, &index, 0, NULL);
if (key && Z_ARRVAL_P(stack) == &EG(symbol_table)) {
zend_delete_global_variable(key, key_len - 1 TSRMLS_CC);
} else {
zend_hash_del_key_or_index(Z_ARRVAL_P(stack), key, key_len, index, (key) ? HASH_DEL_KEY : HASH_DEL_INDEX);
}
//就是下面这里,遍历所有元素,对是数字键的元素重新赋值。pop的off_the_end是1,shift的off_the_end是0
/* If we did a shift... re-index like it did before */
if (!off_the_end) {
unsigned int k = 0;
int should_rehash = 0;
Bucket *p = Z_ARRVAL_P(stack)->pListHead;
while (p != NULL) {
if (p->nKeyLength == 0) {//键值是数字
if (p->h != k) {
p->h = k++;
should_rehash = 1;
} else {
k++;
}
}
p = p->pListNext;
}
Z_ARRVAL_P(stack)->nNextFreeElement = k;
if (should_rehash) {
//因为重新给键赋值,hash过后的位置可能不一样了,就得重新hash后,放到对应的位置。
zend_hash_rehash(Z_ARRVAL_P(stack));
}
} else if (!key_len && index >= Z_ARRVAL_P(stack)->nNextFreeElement - 1) {
Z_ARRVAL_P(stack)->nNextFreeElement = Z_ARRVAL_P(stack)->nNextFreeElement - 1;
}
zend_hash_internal_pointer_reset(Z_ARRVAL_P(stack));
}
Copy after login
PHP_FUNCTION(array_pop)
{
_phpi_pop(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
}
PHP_FUNCTION(array_shift)
{
_phpi_pop(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
}
Copy after login

The above is the detailed content of php function array_shift() to delete the last element in the array. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:php.cn
Statement of this Website
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
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!