在PHP中初始化(空)数组的最佳方法


297

在某些其他语言(例如,AS3)中,已经注意到,如果这样做,初始化新数组更快,var foo = []而不是var foo = new Array()因为对象创建和实例化的原因。我想知道PHP中是否有任何等效项?

class Foo {
    private $arr = array(); // is there another / better way?
}

11
那就是我曾经做过的一切。
马修

2
感谢所有回答的人(很快!)。我不得不随意选择一个答案,所以安迪似乎是最深入的。
汤姆·奥格

1
这个问题有很大帮助
亚太区首席技术官Matt


2
@ zx1986是创建空数组的一种非常繁琐的方法。当然少于OP $arr = array()$arr = []
Tom Auger 2015年

Answers:


189

在ECMAScript实现中(例如,ActionScript或JavaScript),Array()是构造函数,并且[]是数组文字语法的一部分。两者都以完全不同的方式进行了优化和执行,字面语法不受调用函数的开销的困扰。

另一方面,PHP的语言构造可能看起来像函数,但没有被这样看待。即使使用支持[]替代的PHP 5.4,开销也没有区别,因为就编译器/解析器而言,它们完全是同义词。

// Before 5.4, you could only write
$array = array(
    "foo" => "bar",
    "bar" => "foo",
);

// As of PHP 5.4, the following is synonymous with the above
$array = [
    "foo" => "bar",
    "bar" => "foo",
];

如果需要支持旧版本的PHP,请使用以前的语法。对于可读性也有一个争论,但是,作为一个长期的JS开发人员,后者对我来说似乎很自然。实际上,[]当我第一次学习PHP时,尝试使用初始化数组确实犯了一个错误。

最初,由于对核心开发人员的多数表决,对语言进行了更改,但由于以下原因,该更改被拒绝:

由于很少有核心开发人员投票反对,因此不接受此补丁。尽管如果您在核心开发人员和用户级投票之间采取累积的平均态度似乎表明情况恰恰相反,那么从长远来看,不支持或维护提交补丁程序是不负责任的。

但是,似乎对5.4的态度有所改变,这可能是受对流行数据库(如MongoDB(使用ECMAScript语法)的支持)的实现影响的。


51
可能进行5.4更改是因为可以拼写“ that”的人接管了投票过程:)
Rob Grant

40
我更喜欢$array = [];它,因为它使在JS和PHP之间来回切换更加容易。
贾斯汀

那么是$array = []; 更好的选择吗?还是我应该尝试另一个。哪个更好
-Hitesh

2
@hitesh:这是个人喜好问题。它们在功能上完全相同,[]只是键入起来稍微容易一点。
2014年

7
[]语法似乎是普遍首选的语法,但需要注意的是,仍有大量主机仍在单独使用5.3。如果要分发代码,则[]语法将失效。

204
$myArray = []; 

创建空数组。

您可以稍后将值推入数组,如下所示:

$myArray[] = "tree";
$myArray[] = "house";
$myArray[] = "dog";

此时,$ myArray包含“树”,“房子”和“狗”。上面的每个命令都会追加到数组,以保留已经存在的项目。

由于来自其他语言,这种附加到数组的方式对我来说很奇怪。我期望必须做一些像$ myArray + =“ dog”之类的事情……或者可能是像Visual Basic集合那样的“ add()”方法。但是这种直接附加语法肯定是简短而方便的。

实际上,您必须使用unset()函数来删除项目:

unset($myArray[1]); 

...将从数组中删除“ house”(数组从零开始)。

unset($myArray); 

...将破坏整个阵列。

需要明确的是,用于追加到数组的空方括号语法只是一种告诉PHP自动将索引分配给每个值的方法,而不是您分配索引的方法。在幕后,PHP实际上是在这样做:

$myArray[0] = "tree";
$myArray[1] = "house";
$myArray[2] = "dog";

您可以根据需要自己分配索引,也可以使用任何数字。您还可以将索引号分配给某些项目,而不是其他项目。如果这样做,PHP将填写丢失的索引号,从分配的最大索引号开始递增。

因此,如果您这样做:

$myArray[10] = "tree";
$myArray[20] = "house";
$myArray[] = "dog";

...项目“ dog”的索引号为21。PHP不会为增量索引分配进行智能模式匹配,因此它不会知道您可能希望它为“ dog”分配30的索引”。您可以使用其他函数来指定数组的增量模式。我不会在这里讨论,但是所有内容都在PHP文档中。

干杯,

-=卡梅隆


6
重要的是要注意,$ ary = []仅在PHP 5.4之后可用。从性能的角度来看,[]与array()相比没有优势。
Tom Auger 2015年

1
对于早期版本,您可以使用array_push()w3schools.com/php/func_array_push.asp 我不知道是否有与此相关的性能下降。
标记

3
您误解了@TomAuger的观点@Mark。 $array[] = 'foo'在旧版本的PHP中工作正常。只是$array = [];初始化5.4中的新数组。
Codemonkey

公平地说,这实际上回答了OP的问题。
Smitty

大声笑... 几十年的PHP,我只是在学习,您不需要array_push。
Bangkokian


26

在PHP中,数组是一个数组。没有原始对象和对象的考虑,因此没有可比的优化。


1
IMO的最佳答案:有不同的语法,但就性能而言,它们都是相同的。
Matthieu Napoli 2012年

1
涉及两个..where存在性能问题,我可以检查这个..任何链接或文档
亚太区首席技术官Matt

2
结果,直到您确定您的代码永远不会在5.4之前的环境中运行,请使用$ array = new array()
Tom Auger 2014年

20

您正在做的事情是100%正确的。

在很好的命名方面,通常会在私有/受保护的属性前加上下划线,以使其明显不是公开的。例如private $_arr = array()public $arr = array()


2
在php中,我认为最好不要用下划线命名,因为您总是使用$this获取值,并且永远不要使用公共属性。
梅兹

1
@meze您将像$this->arr和一样访问它们$this->_arr。为什么不应该使用公共财产?
詹姆士·C

5

尝试这个:

    $arr = (array) null;
    var_dump($arr);

    // will print
    // array(0) { }

4
Kinda很酷,但它不是真正有用的编码模式,而是更多的聚会技巧,您不觉得吗?
Tom Auger 2014年

如果要在具有属性模式的对象中创建数组并将其最终转换为数组,这可能会很有用。
Jomar Sevillejo 2015年

4

没有别的办法,所以这是最好的。

编辑:自PHP 5.4及更高版本以来,此答案无效。


事实已不再如此,5.4引入了数组的简写语法。
Andy E

13
@Motes为什么这么多的仇恨:“?。(开玩笑之外,我所做的是‘惊人的’旧的答案是更加明确这可能仍然是有用的新手明白,答案已经改变
马修那不勒斯

@Motes人们在删除答案时会失去代表的代表收获。最好对其进行编辑。
mbomb007 '19

4

初始化一个简单数组:

<?php $array1=array(10,20,30,40,50); ?>

在array中初始化数组:

<?php  $array2=array(6,"santosh","rahul",array("x","y","z")); ?>

来源:为代码而生


3
最初的问题是关于如何初始化一个数组。
Tom Auger 2014年
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.