php刪除數組中的最後一個元素的函數array_shift()

來源:互聯網
上載者:User

刪除數組中的第一個元素(red),並返回被刪除的元素:

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

定義和用法

array_shift() 函數用於刪除數組中的第一個元素,並返回被刪除的元素。

注釋:如果鍵名是數位,所有元素都將獲得新的鍵名,從 0 開始,並以 1 遞增(參見下面執行個體)。

文法

array_shift(array)

參數 描述

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);}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.