Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 关联数组与SplObjectStorage_Php_Oop_Associative Array_Spl - Fatal编程技术网

Php 关联数组与SplObjectStorage

Php 关联数组与SplObjectStorage,php,oop,associative-array,spl,Php,Oop,Associative Array,Spl,我正在编写代码来管理一组独特的对象。这段代码的第一个原型使用了关联数组,基本上我一直都是这样做的 然而,我也热衷于利用添加到更现代版本的PHP(如[SplObjectStorage][1])中的功能来实现这一点,一部分是作为一种学习体验,另一部分是因为它必然会带来优势(我看到的基准测试表明,SplObjectStorage在很多情况下都比数组快) 当前实现有一个关联数组,在向数组中添加新对象之前,我会在数组()中使用进行检查,以查看对象是否已经在数组中 我能看到的关于SplObjectStora

我正在编写代码来管理一组独特的对象。这段代码的第一个原型使用了关联数组,基本上我一直都是这样做的

然而,我也热衷于利用添加到更现代版本的PHP(如
[SplObjectStorage][1]
)中的功能来实现这一点,一部分是作为一种学习体验,另一部分是因为它必然会带来优势(我看到的基准测试表明,
SplObjectStorage
在很多情况下都比数组快)

当前实现有一个关联数组,在向数组中添加新对象之前,我会在数组()中使用
进行检查,以查看对象是否已经在数组中

我能看到的关于
SplObjectStorage
的一个大问题是,(乍一看)它似乎不是支持键/值关联数组行为,只能将其视为索引数组。但是,PHP较新功能的文档不符合该语言更成熟部分的文档标准,我可能只是缺少了一些东西


我可以用
SplObjectStorage
代替关联数组吗?如果可以,在添加新对象时如何定义键?更重要的是,与关联数组相比,
SplObjectStorage
的相对优缺点是什么?

您不应该将
SplObjectStorage
视为键值矿石,但仅仅是一组对象。某物是否在集合中,但其位置并不重要

SplObjectStorage
中元素的“键”实际上是对象的散列。这使得无法将同一对象实例的多个副本添加到
SplObjectStorage
,因此在添加之前不必检查副本是否已存在

但是,在
PHP5.4
中有一个名为
getHash()
的新方法,您可以重写该方法以返回对象的“hash”。从某种意义上说,该方法返回/设置键,以便允许它在不同条件下存储


SplObjectStorage
的主要优点是,您可以获得许多处理不同集合并与之交互的方法(
contains()
removeAll()
removeAllExcept()
等)。它的速度稍微好一点,但是内存使用情况比普通PHP数组差。

当分配给数组的所有内存都用完时,分配给数组的内存将加倍。在这种情况下,对象集合可能是更有效的结构。

PHP 5.6.1上运行10000次迭代后产生的结果3

类型 填补空缺的时间到了 该检查了 记忆 SplObjectStorage 0.021285057068 0.019490000000 2131984 排列 0.021125078201 0.020912000000 1411440
@ajreal的可能重复:我不认为我的问题与您指出的问题完全相似。仔细看了一下,但仍然不明白我的问题(您是否可以使用SplObjectStorage代替关联数组,如果可以,优点和缺点是什么?)是该问题的重复(为什么我不能在SplObjectStorage中放置字符串?)我想问题已经建议,如果您想关联数组,然后使用spl对象哈希,并附加到spl存储对象。缺点?很麻烦。spl存储对象的好处是使用索引键(请参阅实现仅使用下一步、上一步来推进指针)在我的实验中,splObjectStorage实际使用的内存比存储对象哈希的一组数组要少。我实际上运行了一个速度测试,该测试已经发布在这里:splObjectStorage似乎有一个大约10000个DOMDocuments的最佳点,在这之后mance降级。时间差只有3%,而不是50%?内存差只有34%,而不是50%。@roman,你能在这里解释一下你的数学吗?我的意思是你得到的1.5。根据你的数据,我得到的数组填充时间快了1%,检查时间慢了7%,并且使用的内存少了34%。如果能在PHP7中看到统计数据,那就太好了。@twity1337所以运行t他在PHP7实例的链接中提供了代码。