PHP   发布时间:2022-04-04  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了使用PHP迭代器大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

朋友们.我知道,这些迭代器已经存在很多问题.
我读过一些东西,但我不是初学者…但是我对此有些犹豫.请帮助我理解在实践中如何使用迭代器.

假设我有一个ORM对象,可以从数据库中选择实例.一个实例包含字段,并且可以插入,uodate等.
我想遍历一个类型的所有对象,但是由于可以有很多对象,因此我更喜欢通过“页面”来选择它们.我的代码

$limit = 100;
$offset = 0;
do
{
  $recs = $orm->SELEct($filter, $sorTing, $limit , $offset);
  $offset += $limit;
  foreach ($recs as $reC)
  {
    // doing something with record
  }
}
while (count($recs) == $limit);

我觉得迭代器范式最适合这里,但是在这种情况下或者某个基本的SPL类中,哪种接口更好地实现?

更新
理想情况下,上面带有迭代器的代码如下所示:

$iterator = new ORMPagedIterator($ormobject, $filter, $sorTing);
foreach ($iterator as $reC)
{
  // do something with record
}

例如.所有的逐页行为都在迭代器内部.

解决方法:

我将使用一个迭代器,该迭代器在另一个迭代器上进行迭代,并在到达上一个迭代器的末尾时请求下一个迭代器…好吧,听起来确实比实际复杂:

<?PHP
$limit = 100;
$offset = 0;

$iter = new NextIteratorCallBACkIterator(function($i) use ($orm, $limit, &$offset) {
    printf("SELEcTing next bunch at offset %d\n", $offset);
    $recs = $orm->SELEct($filter, $sorTing, $limit , $offset);
    $offset += $limit;
    if ($recs) {
        return new ArrayIterator($recs);
    }
    return null; // end reached
});

foreach ($iter as $reC) {
    // do something with record
}
?>

这是该NextIteratorCallBACkIterator的示例实现:

<?PHP
class NextIteratorCallBACkIterator implements Iterator {
    private $_iterator = null;
    private $_count = 0;
    private $_callBACk;

    public function __construct($callBACk) {
        if (!is_callable($callBACk)) {
            throw new Exception(__CLASS__.": callBACk must be callable");
        }
        $this->_callBACk = $callBACk;
    }

    public function current() {
        return $this->_iterator !== null ? $this->_iterator->current() : null;
    }

    public function key() {
        return $this->_iterator !== null ? $this->_iterator->key() : null;
    }

    public function next() {
        $tryNext = ($this->_iterator === null);
        do {
            if ($tryNext) {
                $tryNext = false;
                $this->_iterator = call_user_func($this->_callBACk, ++$this->_count);
            }
            elseif ($this->_iterator !== null) {
                $this->_iterator->next();
                if ($this->_iterator->valid() == falsE) {
                    $tryNext = true;
                }
            }
        } while ($tryNext);
    }

    public function rewind() {
        $this->_iterator = call_user_func($this->_callBACk, $this->_count = 0);
    }

    public function valid () {
        return $this->_iterator !== null;
    }
}
?>

更新:您的ORMPagedIterator可以使用NextIteratorCallBACkIterator轻松实现:

<?PHP
class ORMPagedIterator implements IteratorAggregate {
    function __construct($orm, $filter, $sorTing, $chunksize = 100) {
        $this->orm = $orm;
        $this->filter = $filter;
        $this->sorTing = $sorTing;
        $this->chunksize = $chunksize;
    }

    function iteratorNext($i) {
        $offset = $this->chunksize * $i;
        $recs = $this->orm->SELEct($this->filter, $this->sorTing, $this->chunksize, $offset);
        if ($recs) {
            return new ArrayIterator($recs);
        }
        return null; // end reached
    }

    function getIterator() {
        return new NextIteratorCallBACkIterator(array($this,"iteratorNext"));
    }
}
?>

大佬总结

以上是大佬教程为你收集整理的使用PHP迭代器全部内容,希望文章能够帮你解决使用PHP迭代器所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: