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

Posted

技术标签:

【中文标题】在 PHP 中初始化(空)数组的最佳方法【英文标题】:Best way to initialize (empty) array in PHP 【发布时间】:2011-08-23 10:20:12 【问题描述】:

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

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

【问题讨论】:

这就是我所做的一切。 感谢所有回答的人(而且这么快!)。我不得不随意选择一个答案,所以安迪的答案似乎是最深入的。 这个问题很有帮助 试试array_fill ? php.net/manual/en/function.array-fill.php @zx1986 这是创建空数组的一种非常麻烦的方法。肯定低于 OP $arr = array()$arr = [] 【参考方案1】:
$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。【参考方案2】:

在 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 时,我实际上犯了一个错误,尝试使用 [] 初始化数组。

该语言的 change 最初是由于核心开发人员的多数票反对而提出并被拒绝的,原因如下:

这个补丁不会被接受,因为核心开发者的投票反对。虽然如果你在核心开发者和用户空间投票之间的累积平均值似乎表明相反,提交一个补丁女巫是不负责任的,从长远来看是不支持或维护的。

但是,在 5.4 之前似乎发生了改变,这可能是受支持流行数据库(如 MongoDB)(使用 ECMAScript 语法)的实现影响。

【讨论】:

可能是 5.4 的更改是因为会拼写“which”的人接管了投票过程:) 我更喜欢$array = [];,因为它让在 JS 和 PHP 之间来回切换更容易。 那么$array = []; 是更好的选择吗???或者我应该尝试其他的。哪个更好 @hitesh:这是个人喜好问题。它们在功能上完全相同,[] 只是更容易输入。 [] 语法似乎是普遍首选的,但重要的是要注意仍有大量主机仍独占使用 5.3。如果你想分发你的代码,[] 语法将致命。【参考方案3】:

PHP 5.4 之前的版本:

$myArray = array();

PHP 5.4 及更高版本

$myArray = [];

【讨论】:

我们如何使用 PHP 5.4 或更高版本制作多维数组?【参考方案4】:

在 PHP 中,数组就是数组;没有原始与对象的考虑,因此没有可比的优化。

【讨论】:

IMO 的最佳答案:有不同的语法,但在性能方面它们都是相同的。 两者都存在性能问题..我在哪里可以检查这个..任何链接或文档 因此,在您确定您的代码永远不会在 5.4 之前的环境中运行之前,请使用 $array = new array()【参考方案5】:

你所做的是 100% 正确的。

就良好的命名而言,通常会在私有/受保护的属性前面加上下划线,以表明它们不是公共的。例如。 private $_arr = array()public $arr = array()

【讨论】:

在 php 中,我认为最好不要用下划线命名它们,因为你总是使用 $this 来获取值,并且永远不应该使用公共属性。 @meze 你可以像$this->arr$this->_arr 一样访问它们。为什么永远不要使用公共属性?!【参考方案6】:

初始化一个简单的数组:

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

在数组中初始化数组:

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

来源:Sorce for the code

【讨论】:

原来的问题是关于如何初始化一个empty数组。 为此而来,但希望您使用的是简短版本而不是古老的 array()【参考方案7】:

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

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

【讨论】:

现在不再这样了,5.4 引入了数组的简写语法。 @Motes 为什么这么讨厌 :'( ?开个玩笑,我通过“删除”旧答案使其更加明确。对于新手来说,了解答案仍然有用改变了。 @Motes 人们在删除答案时会失去从答案中获得的代表收益。最好编辑一下。【参考方案8】:

试试这个:

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

    // will print
    // array(0)  

【讨论】:

有点酷,但更像是一种派对技巧,而不是真正有用的编码模式,你不觉得吗? 如果您想在具有属性模式的对象中创建数组并最终将其转换为数组,这可能会很有用。

以上是关于在 PHP 中初始化(空)数组的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

JAVA06_Optional类概述初始化常用方法最佳实践

JAVA06_Optional类概述初始化常用方法最佳实践

PHP - 使用大量参数和默认值初始化对象的最佳方法

PHP - 判断变量是否为空

php基本整理1

为啥我的数组列表即使在初始化后也会抛出空指针异常?