Heim > Artikel > Backend-Entwicklung > Verwenden Sie array_push() nicht innerhalb eines Schleifenkörpers
Der Titel lautet „Array_push() nicht im Schleifenkörper verwenden“. Tatsächlich ist dies nur eine der Schlussfolgerungen dieses Artikels.
Untersuchen wir die angehängten Elemente des Arrays in der PHP-Sprache.
Elemente an das Array anhängen
Wir wissen, dass es für PHP zwei Möglichkeiten gibt, Elemente an das Ende des Array-Stacks anzuhängen
$a = []; array_push($a,'test'); $a[] = 'test';
Was ist also der Unterschied zwischen diesen beiden Methoden?
Vergleichen wir zuerst die Leistung
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; } }
Codetest schreiben
Schleife zum Anhängen von 1 Million Elementen
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;
Ergebnisse
Die Ergebnisse liegen auf der Hand, $a[] = fast dreimal schneller als mit array_push()
count pushEachOne result | 1000000 count pushEachTwo result | 1000000 pushEachOne | 1.757071018219 pushEachTwo | 0.67165303230286
Analyse
array_push () Warum ist es langsam? Es ist so langsam. Gibt es Szenarien, in denen wir es verwenden können?
Offizielles Handbuch
array_push — 将一个或多个单元压入数组的末尾(入栈) array_push ( array &$array , mixed $value1 [, mixed $... ] ) : int array_push() 将 array 当成一个栈,并将传入的变量压入 array 的末尾。array 的长度将根据入栈变量的数目增加。和如下效果相同: <?php$array[] = $var;?>
Und wiederholen Sie die oben genannten Aktionen für jeden eingehenden Wert.
● Hinweis: Wenn Sie array_push() verwenden, um dem Array eine Einheit hinzuzufügen, ist es besser, $array[] = zu verwenden, da keine zusätzliche Belastung durch den Aufruf der Funktion entsteht.
● Hinweis: array_push() gibt eine Warnung aus, wenn das erste Argument kein Array ist. Dies unterscheidet sich vom Verhalten von $var[], das ein neues Array erstellt.
Offizieller Quellcode
Sehen Sie sich array_push() im Quellcode an
/* {{{ 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[] = Die Implementierung wird entsprechend der Zuweisung aufgerufen Variablentyp Eine Reihe von Zend_API-Funktionen add_next_index_*, die zend_hash_next_index_insert direkt aufrufen, nachdem ein zval-Wert des entsprechenden Typs festgelegt wurde
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; } /* }}} */
Zusammenfassung
Nach der obigen Analyse scheint es so wie array_push() Es hat keinen Sinn für die Existenz, ist das wirklich so?
● Im Allgemeinen ist die Leistung von array_push() zu schlecht, daher sollten wir $array[] = verwenden, um es zu ersetzen.
● Wenn Sie mehrere Einheiten gleichzeitig anhängen, verwenden Sie array_push( )
Das obige ist der detaillierte Inhalt vonVerwenden Sie array_push() nicht innerhalb eines Schleifenkörpers. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!