>  기사  >  백엔드 개발  >  php 함수 array_shift() 배열의 마지막 요소를 삭제합니다.

php 함수 array_shift() 배열의 마지막 요소를 삭제합니다.

PHP中文网
PHP中文网원래의
2017-11-01 10:20:001630검색

배열의 첫 번째 요소(빨간색)를 삭제하고 삭제된 요소를 반환합니다.

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

정의 및 사용법

array_shift() 함수는 배열의 첫 번째 요소를 삭제하고 삭제된 요소 요소를 반환하는 데 사용됩니다.

참고: 키가 숫자인 경우 모든 요소는 0부터 시작하여 1씩 증가하는 새 키를 얻습니다(아래 예 참조).

Syntax

array_shift(array)

Parameters Description

array 필수입니다. 배열을 지정합니다. ​

기술 세부 정보 반환 값:

배열에서 제거된 요소의 값을 반환하거나, 배열이 비어 있는 경우 NULL을 반환합니다.

숫자 키 이름 사용:

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

대형 PHP 배열(1w+). array_shfit 및 array_pop을 사용하여 배열 요소를 검색할 때 array_shift는 견딜 수 없을 정도로 느리고 array_pop은 매우 빠릅니다.

답에 대해 먼저 이야기하지 말고 코드를 살펴보겠습니다.

$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)
}

차이점은 무엇인가요?

예, array_shift 작업 후 배열의 키 값이 변경되었습니다. 이것이 array_shift가 느린 이유입니다. array_shift 작업 배열은 숫자 키 값을 0에서 다시 재구성하기 때문입니다. 요소를 제거할 때마다 배열의 모든 요소를 ​​반복해야 합니다. array_pop은 그렇지 않습니다. 하나는 O(1)이고 다른 하나는 O(n) 복잡도입니다. 배열이 크면 효과가 분명해집니다.

PHP에서 해당 함수의 C 코드 구현:

/* {{{ 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));
}
PHP_FUNCTION(array_pop)
{
_phpi_pop(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
}
PHP_FUNCTION(array_shift)
{
_phpi_pop(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
}

위 내용은 php 함수 array_shift() 배열의 마지막 요소를 삭제합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.