6

...比关联数组?

关联数组会占用更多内存吗?

$arr = array(1, 1, 1);
$arr[10] = 1;
$arr[] = 1; // <- index is 11; does the array become associative here?
4

4 回答 4

6

简而言之,PHP 没有非关联数组。

@Sectus 就 PHP 数组的底层实现发布了一个很好的答案。了解“幕后”发生的事情通常是有益的。但不管它们的底层实现如何,PHP 数组作为与键关联的值的有序映射(即关联数组)公开给 PHP 开发人员。总是。

来自PHP:Arrays - Manual

PHP 中的数组实际上是一个有序映射。映射是将值与键相关联的类型。

PHP 数组可以同时包含整数和字符串键,因为 PHP 不区分索引数组和关联数组。

键可以是整数或字符串。

数组是数字索引的误解是由于整数键为方便起见自动递增的特性,在没有明确指定键的情况下。

但请注意,即使所有键都是整数,PHP 中也不能保证某个项目存在于例如 $arr[0] 中,据我所知,这是在任何其他使用索引数组的语言中给出的也就是说,假设索引数组至少包含一个元素,并且是从 0 开始的)。

这不是一个微不足道的区分。恕我直言,依赖 PHP 数组表现得像索引数组而不考虑潜在后果或理解差异*的程序员可能会为奇怪/意外的行为设置自己(或未来的维护者)。

*我已经对此进行了限定,因为显然在某些情况下,明智地决定利用 PHP 语言围绕数组的类似索引的便利/功能可以带来好处。

于 2013-03-25T12:13:10.747 回答
4

PHP 中的数组总是一个哈希表。您可以阅读@NikiC 的这篇文章

基本上,PHP 中的所有内容都是一个哈希表。哈希表不仅用于 PHP 数组的底层实现,还用于存储对象属性和方法、函数、变量以及几乎所有其他内容。

如果键从 0 开始按顺序排列,它看起来像索引数组,但实际上并非如此。

这篇文章也会很有用。

PHP数组同时是数组、字典和链表,这肯定需要很多信息

于 2013-03-25T12:14:29.880 回答
1

所有 PHP 数组都是关联的。PHP 不像其他一些语言那样有“列表”。数字索引数组只是带有数字键的关联数组。数字键有些特殊,在添加项目时可以省略它们,从而导致 PHP 自动索引这些项目。内部数字索引可能使用也可能不使用不同的索引类型(不确定,如果需要,请查看源代码),但它们使用相同的机制,它们并不代表具有不同性能特征的截然不同的数组类型。

于 2013-03-25T12:13:44.093 回答
0

在这种情况下,数组变为关联的。所有 PHP 数组都是某种关联数组,并以哈希表的形式实现。

于 2013-03-25T12:26:32.537 回答