9

作为一名 PHP 程序员,我几乎所有事情都使用数组。我知道SPLFixedArray在某些情况下可能很有用,而且我知道PHP 数组的内存效率不是很高,但我很少遇到他们难以满足我需要的实际情况。

这与我在 Java 中工作时形成鲜明对比的是,我发现准确了解我正在使用的数据结构以及每种数据结构的优缺点绝对至关重要。如果有人建议我对 Java 中的所有内容都使用 LinkedHashMap,他们会被笑出大楼。

那么我们如何才能在 PHP 中摆脱这种快速而松散的工程呢?PHP 数组的基本细节是什么?它通常被描述为“有序映射”,但这留下了很多实现留给猜测。

PHP 数组特别擅长哪些用例?PHP 数组实际上很不擅长的一些看似简单的用例有哪些?

例如,我假设对密集的整数键数组(例如$arr = array('a','b','c','d','e');)比有序哈希映射有更好的处理,但是密集和稀疏之间的边界在哪里?一旦我引入一个无序键,数组的效率是否会大大降低,比如$arr[10] = 'f';?怎么样$arr[1000000] = 'g';?我假设 PHP 不会填充大约 100 万个插槽,但如果它是一个隐藏的链表,那么$arr[rand()] = rand();重复调用可能必须在每次插入后进行一些重新排序?

欢迎任何探索 PHP 数组底层细节的答案,即使它没有解决我提出的具体问题。

4

2 回答 2

1

PHP 数组的基本问题是它们是两种不同数据类型的混搭:数组和映射。Javascript 或 Python 中的数组是简单的有序列表,从 0 开始按数字索引。非常易于理解和使用。地图(又名字典)是(通常是无序的)键值对的集合。同样,非常易于理解和使用。

PHP 数组既可以是两者,也可以两者兼而有之,具体取决于您对它们的处理方式,并且使用 PHP 的数组函数的某些操作可能会导致它们以意想不到的方式运行。数组键可以是(例如)字符串或整数,但字符串键不能是数字,因为无论您做什么,PHP 都会强制将其转换为整数。这可能会在(例如)将数据与 JSON 相互转换时产生问题,因为您最终可能会得到多个不同类型的相似数字键。

PHP 的开发人员应该保持这两种数据类型不同。使用数组表示法制作动态地图可能很方便,但他们不应该这样做。我不是 Python 的忠实粉丝(......但是),但列表和映射之间的正式区别是他们肯定比 PHP 做得更好的一件事。

于 2013-04-19T21:44:34.817 回答
1

PHP 数组在建模任意空间坐标方面非常出色。您可以很容易地创建 perlin 噪声值的缓存 - 正值、负值等。

PHP 数组非常适合表示配置对象。灵活的键类型使这一切变得轻而易举。

PHP 数组让您对键和索引之间的区别感到困惑。非常糟糕。

PHP 数组通常比较慢——尽管它可能是 PHP 本身,而不是真正的数组——并且总是给你比你真正需要的更多的选择。它导致了像这样一个可怕的问题:

PHP:迭代两个并行数组的最佳方法?

看看他的阵法。他们是……他们是什么?任意参数列表?

php数组也很擅长的另一件事!

$class->call('func', Array(..params..));
于 2012-04-13T02:54:14.600 回答