中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

php中向數組追加元素的方法有哪些

發布時間:2020-10-13 14:59:34 來源:億速云 閱讀:321 作者:小新 欄目:編程語言

小編給大家分享一下php中向數組追加元素的方法有哪些,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

向數組追加元素

我們知道 php 在數組棧尾追加元素的方式有兩種

$a = []; array_push($a,'test');
$a[] = 'test';

那么這兩種方式有什么區別呢?

我們先來比較一下性能

ArrayPush
一個 ArrayPush 類
pushEachOne() 循環體中使用 array_push() 來為 $a 追加元素
pushEachTwo() 循環體中使用 $a[] = $var 來為 $a 追加元素
/**
 * Class ArrayPush
 */
class ArrayPush
{
    /**
     * @param int $times
     * @return array
     */
    public static function pushEachOne(int $times): array
    {
        $a = [];
        $b = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
        for ($i = 0; $i < $times; $i++) {
            array_push($a, $b[$i % 10]);
        }
        return $a;
    }
    /**
     * @param int $times
     * @return array
     */
    public static function pushEachTwo(int $times): array
    {
        $a = [];
        $b = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
        for ($i = 0; $i < $times; $i++) {
            $a[] = $b[$i % 10];
        }
        return $a;
    }
}

編寫代碼測試

循環追加 100 萬個元素

ini_set('memory_limit', '4000M');
$timeOne = microtime(true);
$a       = ArrayPush::pushEachOne(1000000);
echo 'count pushEachOne result | ' . count($a) . PHP_EOL;
$timeTwo = microtime(true);
$b       = ArrayPush::pushEachTwo(1000000);
echo 'count pushEachTwo result | ' . count($b) . PHP_EOL;
$timeThree = microtime(true);
echo PHP_EOL;
echo 'pushEachOne | ' . ($timeTwo - $timeOne) . PHP_EOL;
echo 'pushEachTwo | ' . ($timeThree - $timeTwo) . PHP_EOL;
echo PHP_EOL;

結果

結果不言而喻,$a[] = 比使用 array_push() 快了接近三倍

count pushEachOne result | 1000000
count pushEachTwo result | 1000000
pushEachOne | 1.757071018219
pushEachTwo | 0.67165303230286

分析

array_push () 為什么慢?這么慢,我們還有使用它的場景嗎?

官方手冊

array_push — 將一個或多個單元壓入數組的末尾(入棧)
array_push ( array &$array , mixed $value1 [, mixed $... ] ) : int
array_push() 將 array 當成一個棧,并將傳入的變量壓入 array 的末尾。array 的長度將根據入棧變量的數目增加。和如下效果相同:
<?php$array[] = $var;?>

并對每個傳入的值重復以上動作。

● Note: 如果用 array_push() 來給數組增加一個單元,還不如用 \$array[] = ,因為這樣沒有調用函數的額外負擔。

● Note: 如果第一個參數不是數組,array_push() 將發出一條警告。這和 \$var[] 的行為不同,后者會新建一個數組。

官方源碼

看一下源碼中的 array_push()

/* {{{ proto int array_push(array stack, mixed var [, mixed ...])
   Pushes elements onto the end of the array */
PHP_FUNCTION(array_push)
{
    zval   *args,       /* Function arguments array */
           *stack,      /* Input array */
            new_var;    /* Variable to be pushed */
    int i,              /* Loop counter */
        argc;           /* Number of function arguments */
    //這一段是函數的參數解析
    ZEND_PARSE_PARAMETERS_START(2, -1)
        Z_PARAM_ARRAY_EX(stack, 0, 1)
        Z_PARAM_VARIADIC('+', args, argc)
    ZEND_PARSE_PARAMETERS_END();
    /* For each subsequent argument, make it a reference, increase refcount, and add it to the end of the array */
    for (i = 0; i < argc; i++) {
        //拷貝一個
        ZVAL_COPY(&new_var, &args[i]);
        //插入新數值,自動
        if (zend_hash_next_index_insert(Z_ARRVAL_P(stack), &new_var) == NULL) {
            if (Z_REFCOUNTED(new_var)) Z_DELREF(new_var);
            php_error_docref(NULL, E_WARNING, "Cannot add element to the array as the next element is already occupied");
            RETURN_FALSE;
        }
    }
    /* Clean up and return the number of values in the stack */
    RETVAL_LONG(zend_hash_num_elements(Z_ARRVAL_P(stack)));
}
/* }}} */

$a[] = 的實現是根據賦值的變量類型調用了一系列 Zend_API 函數 add_next_index_* ,它們在設置一個對應類型的 zval 值以后直接調用了 zend_hash_next_index_insert

ZEND_API int add_next_index_long(zval *arg, zend_long n) /* {{{ */
{
    zval tmp;
    ZVAL_LONG(&tmp, n);
    return zend_hash_next_index_insert(Z_ARRVAL_P(arg), &tmp) ? SUCCESS : FAILURE;
}
/* }}} */
ZEND_API int add_next_index_null(zval *arg) /* {{{ */
{
    zval tmp;
    ZVAL_NULL(&tmp);
    return zend_hash_next_index_insert(Z_ARRVAL_P(arg), &tmp) ? SUCCESS : FAILURE;
}
/* }}} */
ZEND_API int add_next_index_bool(zval *arg, int b) /* {{{ */
{
    zval tmp;
    ZVAL_BOOL(&tmp, b);
    return zend_hash_next_index_insert(Z_ARRVAL_P(arg), &tmp) ? SUCCESS : FAILURE;
}
/* }}} */
ZEND_API int add_next_index_resource(zval *arg, zend_resource *r) /* {{{ */
{
    zval tmp;
    ZVAL_RES(&tmp, r);
    return zend_hash_next_index_insert(Z_ARRVAL_P(arg), &tmp) ? SUCCESS : FAILURE;
}
/* }}} */
ZEND_API int add_next_index_double(zval *arg, double d) /* {{{ */
{
    zval tmp;
    ZVAL_DOUBLE(&tmp, d);
    return zend_hash_next_index_insert(Z_ARRVAL_P(arg), &tmp) ? SUCCESS : FAILURE;
}
/* }}} */
ZEND_API int add_next_index_str(zval *arg, zend_string *str) /* {{{ */
{
    zval tmp;
    ZVAL_STR(&tmp, str);
    return zend_hash_next_index_insert(Z_ARRVAL_P(arg), &tmp) ? SUCCESS : FAILURE;
}
/* }}} */
ZEND_API int add_next_index_string(zval *arg, const char *str) /* {{{ */
{
    zval tmp;
    ZVAL_STRING(&tmp, str);
    return zend_hash_next_index_insert(Z_ARRVAL_P(arg), &tmp) ? SUCCESS : FAILURE;
}
/* }}} */
ZEND_API int add_next_index_stringl(zval *arg, const char *str, size_t length) /* {{{ */
{
    zval tmp;
    ZVAL_STRINGL(&tmp, str, length);
    return zend_hash_next_index_insert(Z_ARRVAL_P(arg), &tmp) ? SUCCESS : FAILURE;
}
/* }}} */
ZEND_API int add_next_index_zval(zval *arg, zval *value) /* {{{ */
{
    return zend_hash_next_index_insert(Z_ARRVAL_P(arg), value) ? SUCCESS : FAILURE;
}
/* }}} */

總結

經過上面的分析,仿佛 array_push() 沒有任何存在的意義,真的是這樣嗎?

● 一般情況下,array_push() 性能太差,所以我們應當使用 $array[] = 來替換掉它

● 如果一次追加多個單元,使用 array_push()

以上是php中向數組追加元素的方法有哪些的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

php
AI

红原县| 革吉县| 兖州市| 乡宁县| 淮南市| 紫云| 定结县| 湖北省| 沂水县| 城步| 凤阳县| 宁强县| 顺平县| 巢湖市| 雷州市| 玉溪市| 吴桥县| 晋中市| 大石桥市| 屏南县| 嵊泗县| 醴陵市| 东安县| 治县。| 射阳县| 辽源市| 轮台县| 浦县| 苍山县| 白山市| 台中县| 印江| 浦北县| 温州市| 阿合奇县| 宁南县| 新郑市| 喀什市| 威海市| 宜兰县| 台州市|