array_push()和$ array []之间的区别=


117

在PHP手册中,(array_push)说..

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

例如 :

$arr = array();
array_push($arr, "stackoverflow");
print_r($arr);

$arr[] = "stackoverflow";
print_r($arr);

我不明白为什么会有很大的不同。


8
一个是函数调用,另一个不是。确切地说是在框中提到的。
2013年

1
一种是如上所述的函数调用,这意味着要使用一些资源来将控制切换到函数调用/从函数调用切换(因此导致开销处理)。而稍后只是直接将新元素分配到数组中。
Ghazanfar Mir

2
这个问题为我节省了很多时间推到数组:)
RozzA

Answers:


151

当您使用PHP调用函数(例如array_push())时,调用会产生开销,因为PHP必须查找函数引用,在内存中查找其位置并执行其定义的任何代码。

使用$arr[] = 'some value';不需要函数调用,而是直接在数据结构中实现添加。因此,添加大量数据时,使用起来会更快,更节省资源$arr[]


3
如果这样的符号“ $ arr [] ='some value';”怎么办?归结为函数的调用?
特贝2014年

1
@gekannt这将如何发生?您的意思是说评论中的“某些价值”是否为闭包?那将把闭包的引用存储到数组中。如果您说“某个值”是被调用的函数,则它将添加该函数返回的内容。
柯克兰2014年

@Kirkland运算符只是大多数C语言中具有替代语法的函数,我不是PHP专家,但是我可以想象它们是C语言,因此以相同的方式实现了运算符。
凯文

1
@Kevin:您同意我的看法,并且我很确定在备用语法后面有一个函数,它不是上面提到的那个,因为我在php文档中看到了一个荒唐的注释:“如果您使用array_push()添加一个元素对于数组,最好使用$ array [] =,因为那样就不会产生调用函数的开销。” 现在没有时间确切地了解其背后的内容,因为搜索词对搜索引擎而言有些混乱:)
jnhghy-Alexandru Jantea

是否有任何实际证据证明$arr[] = value速度更快?试图想象为什么编译器会以不同的方式对待代码。
c ..

44

您可以使用array_push在一个镜头中向数组添加1个以上的元素,

例如 array_push($array_name, $element1, $element2,...)

其中$ element1,$ element2,...是要添加到数组中的元素。

但是,如果您想一次仅添加一个元素,则应首选其他方法(即使用$ array_name [])。


在整个项目中根据需要将两者结合起来是不好的做法吗?
PBwebD

1
@ testing123绝对不是。最好使用手头上可用的最有效的解决方案,除非它严重破坏了可读性,兼容性等(或者如果您需要遵循某些样式指南)。
克里斯·克拉瑟夫斯基

15

区别在下面的代码行中,“因为这样没有调用函数的开销”。

array_push()如果第一个参数不是数组,将发出警告。这与$var[]创建新数组的行为不同。


4
我没有说这是一个原因。在问题中,有人问过差异,这也就是差异
Baig


4

array_push —将一个或多个元素推到数组的末尾

注意单词“ 末尾有一个或多个元素 ”,要使用$arr[]该数组,必须获得数组的最大大小


关于“使用$ arr []来做到这一点,您将必须获得数组的最大大小”。不,您对$arr[...index...] = $value;此处讨论的内容感到困惑$arr[] = $value;。不需要知道大小或数组就可以推到最后。多个元素将只是多个调用: $arr[] = $value1; $arr[] = $value2; $arr[] = $value3;
ToolmakerSteve

2

说明:1.第一个在数组中声明变量。

2.第二个array_push方法用于将字符串推送到array变量中。

3.最终它将打印结果。

4.第二种方法是直接将字符串存储在数组中。

5.使用print_r方法将数据打印到数组值中。

这两个是一样的


1

两者是相同的,但是array_push在它的参数中做一个循环,该参数是一个数组并执行$ array [] = $ element


0

我知道这是一个古老的答案,但是对其他人来说,这两者之间的另一个区别可能是有用的,如果每个循环必须向数组中添加超过2/3的值,则使用起来会更快:

     for($i = 0; $i < 10; $i++){
          array_push($arr, $i, $i*2, $i*3, $i*4, ...)
     }

代替:

     for($i = 0; $i < 10; $i++){
         $arr[] = $i;
         $arr[] = $i*2;
         $arr[] = $i*3;
         $arr[] = $i*4;
         ...
     }

编辑-忘记关闭for条件括号


1
我不知道这与array_merge相比如何。例如for(...){ $arr = $arr + [$i, $i*2, $i*3, $i*4, ...] }。我推测array_push仍然比那快。
ToolmakerSteve

0

没有人说,但是array_push只将元素推到数组的末尾,其中$ array [index]可以在任何给定的索引处插入一个值。巨大差距。


问题是“ array_push()与$ array [] =“之间的区别是我所说的一个区别。一个大的!
马可(Marco)

1
我谨不同意。你所描述的$array[index] = ,这是一个不同的操作$array[] = ...。该问题给出了两段代码,并询问为什么它们之间会有显着的[性能]差异。这个问题的字面意思是$array[] = ...,它是一个特定的php惯用语,不涉及索引。数组+索引解决了一个不同的问题,产生了不同的代码,并且权衡取舍。
ToolmakerSteve
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.