length - php数组push




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

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

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

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

编辑:从PHP 5.4及更高版本开始,此答案无效。


你在做什么是100%正确的。

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


在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语法)的支持的实现的影响。


在PHP 5.4之前:

$myArray = array();

PHP 5.4及更高版本

$myArray = [];

尝试这个:

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

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

$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不会进行智能模式匹配,因此它不会知道您可能希望它将30的索引分配给“dog ”。 您可以使用其他函数来指定数组的增量模式。 我不会在这里进入,但它的全部都在PHP文档中。

干杯,

- =卡梅伦





initialization