在PHP中,最好使用$ array [] = $ value或array_push($ array,$ value)?


113

在PHP中最好使用附加数组成员的方法,

$array[] = $value;

要么

array_push($array, $value);

尽管手册说您最好避免进行函数调用,但我阅读$array[]的速度也比慢得多array_push()。有哪些澄清或基准?


2
$ myArray [] = 123; 这将比array_push函数更快。它将值直接添加到该数组中。函数具有用于该变量的单独堆栈。并且该函数中可能包含该语句。
sganesh

Answers:


150

没有基准,但是我个人觉得看起来$array[]更干净,并且诚实地在毫秒内拆分头发是完全没有关系的,除非您计划将数十万个字符串添加到数组中。

编辑:运行此代码:

$t = microtime(true);
$array = array();
for($i = 0; $i < 10000; $i++) {
    $array[] = $i;
}
print microtime(true) - $t;
print '<br>';
$t = microtime(true);
$array = array();
for($i = 0; $i < 10000; $i++) {
    array_push($array, $i);
}
print microtime(true) - $t;

第一种方法$array[]比第二种方法快将近50%。

一些基准测试结果:

Run 1
0.0054171085357666 // array_push
0.0028800964355469 // array[]

Run 2
0.0054559707641602 // array_push
0.002892017364502 // array[]

Run 3
0.0055501461029053 // array_push
0.0028610229492188 // array[]

这并不奇怪,因为PHP手册指出了这一点:

如果使用array_push()将一个元素添加到数组中,则最好使用$ array [] =,因为这样可以节省调用函数的开销。

它的措辞方式如果array_push添加多个值更有效,我也不会感到惊讶。编辑:出于好奇,进行了一些进一步的测试,即使添加了大量内容,单个$array[]通话也比一个通话快array_push。有趣。


我只是总是更想知道哪种方法最快,因此,当一天到来时,我将被要求创建一个人流量大的站点,我将获得一些见识。感谢你的回答。
alex

10
像这样的微优化很少值得付出努力。如果您是从头开始编写,请按照最有意义的方式进行操作,然后,如果生成页面的速度有些慢,请对其进行概要分析。一路下降到必须进行此类更改以加快速度的可能性很小。
Alister Bulman

4
只是为了确保,因为代码似乎与输出不匹配,所以我验证了这$array[]确实更快,300ms相对于我的机器上1M分配的2000ms。但是,一次在array_push中添加20个项目的速度约为20 $array[] =s。
Elle 2015年

5
如果您正在考虑回顾整个代码库并对其进行“优化”,那么@AlisterBulman微优化就不值得付出努力。但是,如果您有几种不同的方式来做相同的事情,并且知道一种方式比其他方式更好(甚至只有一点),则可以养成使用该方式的习惯。你为什么不这样做呢?
Okonomiyaki3000

2
@AlisterBulman我必须完全不同意,或者至少部分不同意,如果您了解得更好,请写得更好,但不要花太多精力去寻找可能的微观优化...
jave.web

42

array_push()的主要用途是可以将多个值压入数组的末尾。

它在文档中说:

如果使用array_push()将一个元素添加到数组中,则最好使用$ array [] =,因为这样可以节省调用函数的开销。



21

人们常说[]更快,因为没有函数调用的开销。另外,没有人真正喜欢PHP的数组函数...

“是...干草堆,针。...还是针干草堆...啊,f *** ... [] =“


7
??PHP的数组函数很棒。
cletus

13
从功能上来说,它们很棒,是的,但是他指的是不一致的命名方案。
ryeguy

2
您应该在IDE中打开参数提示。但是我同意,某些一致性会很棒。
Pim Jager

4
我同意这一点。命名方案(x_y或xy或y_x ...)和参数逻辑(在数组,字符串和正则表达式之间的第一个,最后一个,最后一个传递目标对象,祝您找到一条通用规则!)都没有一致性。
e2-e4

3
FWIW,我喜欢needle / haystack的命名约定,并发现它很容易记住,因为它与短语的顺序相同:“就像在干草堆(2)中找到一根针(1)”
rybo111

8

一个区别是您可以使用两个以上的参数来调用array_push(),即您可以一次将一个以上的元素推入数组。

$myArray = array();
array_push($myArray, 1,2,3,4);
echo join(',', $myArray);

版画 1,2,3,4


2

一个简单的$ myarray []声明会更快,因为由于缺乏函数带来的开销,您只是将一个项目推入项目堆栈中。


2

由于“ array_push ”是一个函数,当它在循环内时会多次调用,因此它将在堆栈中分配一个内存。但是,当我们使用$ array [] = $ value时,我们只是将value分配给array。


1

第二个是函数调用,因此通常它应该比使用核心阵列访问功能慢。但我认为您的脚本中甚至一个数据库查询都将超过对的1.000.000调用array_push()


0

尽管问题更多地与性能有关,但人们还是会问这个问题,即使用array_pushor还是一个好习惯$arr[]

该函数可能意味着多个值的较少行:

// 1 line:
array_push($arr, "Bob", "Steve");
// versus 2 lines:
$arr[] = "Bob";
$arr[] = "Steve";

然而array_push...

  • 无法接收阵列键
  • 打破针/干草堆命名约定
  • 较慢,如前所述

我会坚持的$arr[]


0

我只是不想添加:int array_push(...)返回数组(php doc)中新的元素数量。比的实用和紧凑$myArray[] = ...; $total = count($myArray);

array_push(...)当将变量用作堆栈时,这也很有意义。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.