在某些其他语言(例如AS3)中,已经注意到,出于对象创建和实例化的原因,如果像var foo = []而不是var foo = new Array()那样初始化新数组会更快。 我想知道PHP中是否有任何等价?
class Foo {
private $arr = array(); // is there another / better way?
}
这就是我做过的一切。
感谢所有回答的人(并且很快!)。 我不得不随意选择一个答案,所以Andy似乎是最深入的。
这个问题有很大帮助
试试array_fill?php.net/manual/en/function.array-fill.php
@ zx1986这是一个非常麻烦的创建空数组的方法。 当然小于OP $arr = array()或$arr = []
$myArray = [];
创建空数组。
您可以稍后将值推送到数组上,如下所示:
$myArray[] ="tree";
$myArray[] ="house";
$myArray[] ="dog";
此时,$ myArray包含"tree","house"和"dog"。上述每个命令都附加到数组,保留已存在的项目。
来自其他语言,这种附加到阵列的方式对我来说似乎很奇怪。我希望必须做一些像$ 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不会为增量索引分配进行智能模式匹配,因此它不会知道您可能希望它为"狗"分配索引30"。您可以使用其他函数指定数组的增量模式。我不会在这里讨论它,但它在PHP文档中都是如此。
干杯,
- =卡梅伦
值得注意的是,$ ary = []仅适用于PHP 5.4之后。从性能的角度来看,[]与array()没有任何优势。
对于早期版本,您可以使用array_push()w3schools.com/php/func_array_push.asp我不知道是否存在与此相关的性能损失。
你误解了@ TomAuger的观点@Mark。 $array[] = 'foo'在旧版本的PHP中运行良好。只有$array = [];才能初始化5.4中的新数组。
多么好的答案 - 如此清楚地解释,任何人都可以理解这一点。
我见过的最完整,最明确的答案之一。很好!
公平地说,这实际上回答了OP的问题。
哈哈...心灵吹拂。几十年的PHP和我只是在学习你不需要array_push。
在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时,我实际上错误地尝试使用[]初始化数组。
由于核心开发人员多数投反对票,最初提出并拒绝了对该语言的更改,原因如下:
This patch will not be accepted because slight majority of the core developers voted against. Though if you take a accumulated mean between core developers and userland votes seems to show the opposite it would be irresponsible to submit a patch witch is not supported or maintained in the long run.
然而,似乎心脏的变化导致5.4,可能受到对MongoDB(使用ECMAScript语法)等流行数据库的支持实现的影响。
可能是5.4的变化是因为那些可以拼写"哪个"接管投票过程的人:)
我更喜欢$array = [];因为它使JS和PHP之间的来回变得更容易。
@Justin:同样在这里,我现在只在PHP中使用方括号语法。
那么$array = [];更好的选择???或者我应该尝试其他的。哪一个更好
@hitesh:这是个人喜好的问题。它们在功能上完全相同,[]只是更容易打字。
[]语法似乎是普遍优先考虑的,但重要的是要注意仍有大量主机仍然使用5.3。如果要分发代码,[]语法将会致命。
我只是有一个致命的错误,如果你正在开发一个可以在任何主机上使用的软件,而不是你自己,不要使用新的语法!
@RobertGrant哈哈哈好一个。他们一定知道如何,已经有一段时间了。
这是一个令人费解的答案。 $ array = [];
在PHP 5.4之前:
$myArray = array();
PHP 5.4及更高版本
$myArray = [];
我们如何使用PHP 5.4或更高版本制作多维数组?
在PHP中,数组是一个数组;没有原始与对象的考虑,因此没有可比较的优化。
最好的答案IMO:有不同的语法,但关于性能他们都是相同的。
是否涉及性能问题..我可以检查这个..任何链接或文档
因此,在确定您的代码永远不会在5.4之前的环境中运行之前,请使用$ array = new array()
你正在做的是100%正确。
就良好的命名而言,通常会在私有/受保护的属性之前加上下划线,以明确它们不是公开的。例如。 private $_arr = array()或public $arr = array()
在PHP中,我认为最好不要用下划线命名它们,因为你总是使用$this来获取值,并且永远不应该使用公共属性。
@meze你可以像$this->arr和$this->_arr一样访问它们。为什么你永远不要使用公共财产?!
试试这个:
$arr = (array) null;
var_dump($arr);
// will print
// array(0) { }
有点酷,但更多的是作为派对技巧而不是真正有用的编码模式,你不觉得吗?
如果您想在具有属性模式的对象中创建数组并在最后将其转换为数组,则可能很有用。
初始化一个简单的数组:
在数组中初始化数组:
最初的问题是如何初始化一个空数组。
没有别的办法,所以这是最好的。 strike>
编辑:此答案自PHP 5.4及更高版本起无效。
这不再是这种情况,5.4引入了数组的简写语法。
的确,我编辑了答案
@Motes为什么这么讨厌:'(开玩笑说,我通过"敲击"旧的答案使其更明确。对于新手来说,了解答案已经改变仍然有用。
@Motes人们在删除答案时会从答案中失去代表收益。编辑它会更好。