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

c9x0cxw0  于 2022-12-25  发布在  PHP
关注(0)|答案(9)|浏览(145)

在某些其他语言中(例如AS3),我们注意到如果像var foo = []这样初始化一个新数组比var foo = new Array()更快,这是因为对象创建和示例化的原因。我想知道PHP中是否有任何等价物?

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

lawou6xi1#

$myArray = [];

创建空数组。
您可以稍后将值推送到数组中,如下所示:

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

此时,$myArray包含了"tree"、"house"和"dog"。上面的每个命令都会追加到数组中,保留已经存在的项。
由于我来自其他语言,这种向数组追加的方式对我来说似乎很奇怪。我原以为必须执行类似$myArray +="dog"之类的操作......或者像Visual Basic集合那样使用"add()"方法。但这种直接追加语法确实很简短和方便。
实际上,您必须使用unset()函数来删除项:

unset($myArray[1]);

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

unset($myArray);

......会摧毁整个阵列。
需要说明的是,用于追加数组的空方括号语法只是告诉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文档中有详细说明。

qjp7pelc

qjp7pelc2#

在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语法)等流行数据库的实现的影响。

xv8emn3q

xv8emn3q3#

PHP 5.4之前版本:

$myArray = array();

PHP 5.4及更高版本

$myArray = [];
e0bqpujr

e0bqpujr4#

在PHP中数组就是数组;没有图元对对象的考虑,因此没有可比较的优化。

e5nszbig

e5nszbig5#

你所做的是100%正确的。
在命名方面,私有/受保护的属性前面通常会加上下划线,以表明它们不是公共的。例如private $_arr = array()public $arr = array()

9rbhqvlz

9rbhqvlz6#

初始化简单数组:

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

正在初始化数组中的数组:

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

来源:Sorce for the code

ykejflvf

ykejflvf7#

没有其他办法了,所以这是最好的办法。
编辑:此答案在PHP 5.4及更高版本之后无效。

7uzetpgm

7uzetpgm8#

试试这个:

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

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

sbdsn5lh9#

不要这样做:

$arrTst = array( 'IdxKeyOne' => null, 'IdxKeyTwo' => null, 'IdxKeyThr' => null );

没有用伪值/占位符值“初始化”数组的索引键这样的事情。print_r给出:

Array (
  [IdxKeyOne] => 
  [IdxKeyTwo] => 
  [IdxKeyThr] => 
)

其中的元素存在,定义了键,但为空值。当以后使用数组时,无论如何都必须删除伪行。

相关问题