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

2022-08-30 06:04:06

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

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

答案 1
$myArray = []; 

创建空数组。

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

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

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

来自其他语言,这种附加到数组的方式对我来说似乎很奇怪。我期望必须做一些事情,比如$myArray+=“狗”之类的东西......或者像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";

...项目“狗”将被赋予索引号21。PHP 不对增量索引分配执行智能模式匹配,因此它不会知道您可能希望它将索引 30 分配给“dog”。可以使用其他函数指定数组的增量模式。我不会在这里讨论,但它都在PHP文档中。

干杯

-=卡梅隆


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

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

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

然而,似乎在5.4之前发生了改变,也许是受到对MongoDB(使用ECMAScript语法)等流行数据库的支持实现的影响。