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


What are the characteristics of PHP's array type as a data structure?

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

这与我在 Java 中工作时形成鲜明对比,在 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数组底层细节的答案都是受欢迎的,即使它没有解决我提出的具体问题。

PHP 数组

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

PHP 数组

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

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

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

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

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

PHP 数组

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

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

看看他的阵列就知道了。他们...它们是什么?任意参数列表?

还有 php 数组擅长的另一件事!

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