Heim >Backend-Entwicklung >PHP-Tutorial >PHP-Funktion array_shift() zum Löschen des letzten Elements im Array
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!