当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在PHP中初始化(空)数组的最佳方法》经验,为你挑选了6个好方法。

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

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

C Landreaux.. 199

$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文档中都是如此.

干杯,

- =卡梅伦



1> C Landreaux..:
$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()没有任何优势.
你误解了@ TomAuger的观点@Mark.`$ array [] ='foo'`在旧版本的PHP中运行得很好.它只是`$ array = [];`来初始化5.4中的新数组.
多么好的答案 - 如此清楚地解释,任何人都可以理解这一点.

2> Andy E..:

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


可能是5.4的变化是因为那些可以拼写"哪个"接管投票过程的人:)
我更喜欢`$ array = [];`因为它使JS和PHP之间的来回变得更容易.
[]语法似乎是普遍优先考虑的,但重要的是要注意仍有大量主机仍然使用5.3.如果要分发代码,[]语法将会致命.
@Justin:同样在这里,我现在只在PHP中使用方括号语法.
@hitesh:这是个人喜好的问题.它们在功能上完全相同,`[]`更容易打字.
这是一个令人费解的答案.$ array = [];

3> Md. Shafiqur..:

在PHP 5.4之前:

$myArray = array();

PHP 5.4及更高版本

$myArray = [];



4> Adrian..:

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


因此,在确定您的代码永远不会在5.4之前的环境中运行之前,请使用$ array = new array()

5> James C..:

你正在做的是100%正确.

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


在PHP中,我认为最好不要用下划线命名它们,因为你总是使用`$ this`来获取值,并且永远不应该使用公共属性.

6> 小智..:

尝试这个:

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

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


Kinda很酷,但不是真正有用的编码模式,而是更多的聚会技巧,您不觉得吗?
推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有