【问题标题】:Associative Array : PHP/C vs Flex/Flash关联数组:PHP/C vs Flex/Flash
【发布时间】:2010-08-11 11:12:58
【问题描述】:
在 PHP 中,关联数组保持其顺序。
// this will keep its order in PHP
a['kiwis']
a['bananas']
a['potatoes']
a['peaches']
However in Flex it doesn't with a perfectly valid explanation。我真的不记得 C 是如何处理这个问题的,但我更倾向于相信它像 php 一样工作,因为数组在内存中预先保留了它的空间,我们可以在内存中走动。我说的对吗?
这里真正的问题是为什么。为什么 C/PHP 对此的解释与 Flash/Flex 不同,Adobe 让 Flash 以这种方式工作的主要原因是什么。
谢谢。
【问题讨论】:
标签:
php
apache-flex
arrays
associative-array
【解决方案1】:
没有 C 实现,您可以根据需要推出自己的实现,或者从预先存在的实现中进行选择。因此,给定的 C 实现可能是有序的或无序的。
至于为什么,原因是优势不同。 Ordered 允许您(显然足够)依赖该排序。但是,当您不需要该订购时,这是一种浪费。
不同的人会认为订购的优势比不订购的优势更重要。
最大的灵活性来自于不排序,就好像你也有某种有序的结构(列表、链表、向量都可以)然后你可以很容易地从中创建一个有序的哈希图(不是最佳解决方案,但这很容易,所以你不能抱怨你没有给你一个)。这使得它成为从设计早期就打算通用的东西的明显选择。
另一方面,排序的缺点通常仅在性能方面,因此对于旨在为新开发人员提供少量类型的相对广泛的支持以供学习的东西来说,它是显而易见的选择。
历史的发展有时会使这些决策成为最优的,有时甚至是次优的,这是任何开发人员都无法真正计划的。
【解决方案2】:
对于 PHP 数组:这些野兽是独特的构造,并且在某种程度上很复杂,在来自 Kendall Hopkins 的斜线响应中给出了概述(向下滚动到他的答案):
Ken:PHP 数组是一个链式哈希表(在键冲突时查找 O(c) 和 O(n))
允许 int 和 string 键。它使用 2 种不同的哈希算法
将这两种类型放入相同的哈希键空间。每个值也存储在
哈希链接到它之前存储的值和之后存储的值
(链表)。它还有一个临时指针,用于保存
当前项目,以便可以迭代哈希。
如前所述,在 C/C++ 中,核心语言中没有“关联数组”。它在 STL 中有一个映射(有序),在新的标准库 (hash_map, unordered_map) 中也有,并且在某些实现上有一个 gnu_hash_map(无序)(恕我直言)。
此外,“有序”C/C++ 映射中元素的“顺序”通常不是“插入顺序”(如 PHP 中),而是“键排序顺序” ”或“字符串哈希值排序顺序”。
回答您的问题:您对 PHP 和 C/C++ 关联数组等价的观点不成立,在 PHP 中,他们做出了设计决定,以便在单个界面下提供最大的舒适度(无论失败还是成功) .在 C/C++ 中,有许多不同的实现(各有优缺点)可用。
问候
rbo