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

dim*_*414 9 php arrays dictionary data-structures

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

这与我在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数组底层细节的答案都是受欢迎的,即使它没有解决我提出的具体问题.

dir*_*ide 1

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

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

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