不要在轮回体中运用array_push()
官方手册
array_push — 将一个或多个单元压入数组的末尾(入栈)
array_push ( array
&$array
, mixed$value1
[, mixed$...
] ) : intarray_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相关技术文章,请拜访PHP教程栏目停止学习!
以上就是不要在轮回体中使用array_push()的具体内容,更多请关注百分百源码网其它相关文章!