PHP的数组类型作为数据结构的特征是什么?

时间:2012-04-13 02:48:50

标签: php arrays dictionary data-structures

作为一名PHP程序员,我几乎都使用数组。我知道SPLFixedArray在某些情况下很有用,我知道PHP arrays aren't very memory efficient,但我很少遇到他们很难做我需要的实际情况。

这与我在Java工作时的情况形成鲜明对比,在那里我发现我完全理解我正在使用的数据结构以及每种数据结构的优缺点。如果有人建议我只使用LinkedHashMap处理Java中的所有内容,那么他​​们就会被嘲笑出来。

那么我们怎样才能在PHP中摆脱这种快速而松散的工程? PHP数组的底层细节是什么?它通常被描述为“一个有序的地图”,但这留下了大量的实施留待猜测。

有哪些用例PHP数组特别擅长?什么是一些看似直截了当的用例,PHP数组在实际上是非常糟糕的?

例如,我假设对于密集的整数键控数组(例如$arr = array('a','b','c','d','e');)有一些比有序哈希映射更好的处理,但那么密集和稀疏之间的边界在哪里?一旦我引入一个非有序密钥(例如$arr[10] = 'f';),数组的效率就会大大降低吗?那么$arr[1000000] = 'g';呢?我假设PHP没有填充中间的~100万个插槽,但是如果它是封面下的链表,那么可能反复调用$arr[rand()] = rand();将在每次插入后进行一些重新排序?

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

2 个答案:

答案 0 :(得分:1)

PHP数组在建模任意空间坐标方面令人惊叹。您可以轻松创建perlin噪声值的缓存 - 正面,负面等等。

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

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

PHP数组通常比较慢 - 虽然它可能是PHP本身而不是数组 - 并且总是给你提供比你真正需要的更多选项。它导致了像这样的可怕问题:

PHP: Best way to iterate two parallel arrays?

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

另外还有一些PHP数组很棒!

$class->call('func', Array(..params..));

答案 1 :(得分:1)

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

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

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