配列の最後の要素を削除するphp関数array_shift()

PHP中文网
リリース: 2023-03-16 21:14:01
オリジナル
1694 人が閲覧しました

配列の最初の要素 (赤色) を削除し、削除された要素を返します:

<?php
    $a=array("a"=>"red","b"=>"green","c"=>"blue");
    echo array_shift($a);print_r ($a);
?>
ログイン後にコピー

定義と使用法

array_shift() 関数は、配列の最初の要素を削除し、削除された要素を返すために使用されます。

注: キーが数値の場合、すべての要素は 0 から始まり 1 ずつ増加する新しいキーを取得します (以下の例を参照)。

構文

array_shift(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_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 はそうではありません。 1 つは O(1)、もう 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 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート