首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扩展ArrayIterator和修改阵列存储

扩展ArrayIterator和修改阵列存储
EN

Stack Overflow用户
提问于 2012-08-10 07:49:28
回答 1查看 1.9K关注 0票数 2

扩展ArrayIterator时,如何访问当前数组进行修改?或者从中获取一些其他数据?

请考虑下面的示例:

代码语言:javascript
复制
class Test extends ArrayIterator {
    public function in_array($key) {
        return in_array($key, ???);
    }
}

???代替$this->getArrayCopy()可以吗?有没有更好的解决方案呢?性能如何?

以及如何动态更改类的数组?例如,使用array_walk。

致以敬意,

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-03 05:35:01

请注意,ArrayIterator类实现了ArrayAccess。要修改数组,只需将$this视为数组:

代码语言:javascript
复制
$this['k'] = 'v';

不幸的是,像in_array这样的函数不适用于类似数组的对象;您需要一个实际的数组。getArrayCopy()可以工作,但我只会使用(array) $this

编辑:正如salathe在评论中指出的那样,getArrayCopy()更好,因为它总是获得内部数组,而如果您使用STD_PROP_LIST标志,(array) $this的行为将有所不同。

在性能方面,复制这样的数组确实会导致较小的速度减慢。作为基准测试,我在包含1000000个项目的ArrayIterator上测试了getArrayCopy()(array),两者在我的机器上都花费了大约0.11秒。另一方面,in_array操作本身(在结果数组上)花费了0.011秒-大约十分之一的时间。

我还尝试了这个版本的in_array函数:

代码语言:javascript
复制
class Test extends ArrayIterator {
    public function in_array($key) {
        foreach($this as $v)
            if($v == $key)
                return true;
        return false;
    }
}

在我的机器上,当搜索一个不存在的值时,该函数运行0.07秒,这是该算法的最坏情况。

在大多数情况下,性能问题太小而无关紧要。如果您的情况足够极端,每个数组元素100纳秒左右实际上会产生差异,那么我建议将您想要搜索的值放在数组键中,并使用offsetExists()

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11893596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档