Heim  >  Artikel  >  Backend-Entwicklung  >  PHP-Funktion array_shift() zum Löschen des letzten Elements im Array

PHP-Funktion array_shift() zum Löschen des letzten Elements im Array

PHP中文网
PHP中文网Original
2017-11-01 10:20:001696Durchsuche

Löschen Sie das erste Element (rot) im Array und geben Sie das gelöschte Element zurück:

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

Definition und Verwendung

array_shift ()-Funktion wird verwendet, um das erste Element im Array zu löschen und das gelöschte Element zurückzugeben.

Hinweis: Wenn der Schlüssel numerisch ist, erhalten alle Elemente neue Schlüssel, beginnend bei 0 und aufsteigend um 1 (siehe Beispiel unten).

Syntax

array_shift(array)

Parameter Beschreibung

Array Erforderlich. Gibt ein Array an.

Technische Details Rückgabewert:

Gibt den Wert des aus dem Array entfernten Elements zurück oder NULL, wenn das Array leer ist.

Numerische Schlüsselnamen verwenden:

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

Beim Verwenden von array_shfit und array_pop zum Abrufen von Array-Elementen ist die Leistungslücke besonders groß. Und array_pop ist sehr schnell.

Reden wir nicht zuerst über die Antwort, schauen wir uns den Code an:

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

Was ist der Unterschied?

Ja, nach der array_shift-Operation hat sich der Schlüsselwert des Arrays geändert. Aus diesem Grund ist array_shift langsam. Weil das Array der Array_Shift-Operation den numerischen Schlüsselwert erneut von 0 aus erstellt. Jedes Mal, wenn Sie ein Element entfernen, müssen Sie alle Elemente im Array durchlaufen. array_pop wird nicht. Einer ist O(1) und der andere ist O(n) Komplexität. Wenn das Array groß ist, wird der Effekt offensichtlich.

C-Code-Implementierung der entsprechenden Funktion 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));
}
PHP_FUNCTION(array_pop)
{
_phpi_pop(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
}
PHP_FUNCTION(array_shift)
{
_phpi_pop(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
}

Das obige ist der detaillierte Inhalt vonPHP-Funktion array_shift() zum Löschen des letzten Elements im Array. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn