PHP的数组类型作为一种数据结构有哪些特点?

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并没有填充中间的 ~1百万个槽,但如果它在内部是链表,那么反复调用 $arr [rand()] = rand(); 将在每次插入后必须进行一些重新排序?
欢迎任何探讨PHP数组底层细节的答案,即使它没有回答我提出的具体问题。

1
因为没有人期望 PHP 表现良好? - Brendan Long
实际上,这里没有涉及重新排序。当您分配给不存在的键时,它会被放置在数组的末尾。 - Ry-
6
我很吃惊宇宙没有在有人把“PHP”和“优点”放在同一个句子里之后重新启动。 - ta.speot.is
PHP在它的弱点中变得强大? :P - user1086498
2个回答

1
PHP数组的根本问题在于它们是两种不同数据类型的混合体:数组和映射。像Javascript或Python中的数组是简单有序的列表,从0开始按数字索引。非常容易理解和使用。映射(又称字典)是键值对的(通常是无序的)集合。同样,非常简单易懂和使用。
PHP数组可以是两者,并且根据您对它们执行的操作,它们可以像两者一样运作。使用PHP的数组函数进行某些操作可能会导致它们以意想不到的方式行事。数组键可以是字符串或整数,但您不能拥有一个数字字符串键,因为PHP将强制将其转换为整数,无论您做什么。这可能会在将数据转换为JSON时创建问题,因为您可能会得到不同类型的多个相似数字键。
PHP的开发人员应该保持这两种数据类型的差异。使用数组符号来创建即席映射可能很方便,但他们不应该这样做。我不是Python的铁杆粉丝(...但),但列表和映射之间的正式区分是他们肯定比PHP做得更好的一件事情。

1

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

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

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

PHP数组通常比较慢 - 虽然这可能是因为PHP本身而不是数组 - 并且总是给您比您实际需要的更多的选项。它会导致像这样可怕的问题:

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

看看他的数组。它们是……什么?任意参数列表吗?

PHP数组还有一个很棒的功能!

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

我希望能够对底层数据结构进行更多的讨论,但感谢您的意见。 - dimo414
6个月过去了,没有收到更多的反馈。如果您认为我会得到更多反馈,那么我将删除它。 - dimo414

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接