php - 扩展ArrayIterator并修改数组存储

标签 php arrayiterator

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

请考虑以下示例:

class Test extends ArrayIterator {
    public function in_array($key) {
        return in_array($key, ???);
    }
}

使用 $this->getArrayCopy() 代替 ??? 可以吗?有没有更好的解决方案来做到这一点?性能怎么样?

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

问候,

最佳答案

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

$this['k'] = 'v';

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

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

就性能而言,制作这样的数组副本确实会导致轻微的速度减慢。作为基准,我在包含 1000000 个项目的 ArrayIterator 上尝试了 getArrayCopy()(array),两者在我的机器上都花费了大约 0.11 秒。另一方面,in_array 操作本身(在生成的数组上)花费了 0.011 秒 - 大约是其十分之一。

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

class Test extends ArrayIterator {
    public function in_array($key) {
        foreach($this as $v)
            if($v == $key)
                return true;
        return false;
    }
}

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

在大多数情况下,性能问题太小,不重要。如果您的情况足够极端,每个数组元素大约 100 纳秒实际上会产生影响,那么我建议将您想要搜索的值放在数组键中并使用 offsetExists() 代替。

关于php - 扩展ArrayIterator并修改数组存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11893596/

相关文章:

php - 排除 Mysql 中的结果,而不是 IN

javascript - 我可以使用数组迭代器执行与 for 循环相同的功能吗?

php - ORM 查询结果 : Arrays vs Result handle wrapped in Iterator interface

php - 如何在 PHP 中使用 ArrayIterator append 带有键的元素?

php - 如何使 ArrayIterator 或 ArrayObject 与 implode 一起工作?

javascript - 在javascript代码中使用php从数据库插入数据

php - 传输 MAMP SQL 数据库

javascript - 将图像保存在使用 javascript guillotine 插件生成的 php 中

php - 在人们将访问的页面上运行此查询是否安全?