PHP 迭代器

说到迭代器这个东西,PHP内置的迭代器还真多。迭代器到底来做什么的呢,其实就是用来遍历一个对象内部数据并且获得想要的结构。迭代器它可以控制foreach 语句的循环结构,通过适当的拓展可以获得指定情况下遍历的结果。就例如,PHP提供搜索,递归,聚集,XMl等各类型的迭代器。种类繁多,功能齐全,比如要处理个XML,用个simplexmliterator 就立马见效。
下面介绍一下最基础的几个迭代器的接口:
Traversable : 这个是最初始的接口,他提供了控制foreach 语句的内置功能。所谓内置,就是只由PHP核心器去控制,外部无法调用。也就是说这个接口是无法被外部应用所应用。
Iterator : 这个接口继承了Traversable ,并且包含了控制foreach 的五个重要的函数 : rewind() , valid(), key(),current(),next() ,它实现了foreach每一步的动作。
iteratoraggregate : 这个接口以继承了Traversable, 它最大的功能是可以将实现Iterator的类移除在外,自身不用去实现那五个方法便可实现控制foreach的目的。

一个简单的例子:

       class MyIterator implements Iterator{

              protected $position;

              protected $arr;

              public function __construct($array){

                     $this->arr = $array;

                     $this->postion = 0;

              }

              public function rewind(){

                     var_dump(__METHOD__);

                     $this->position = 0;

              }

              public function valid(){

                     var_dump(__METHOD__);

                     return isset($this->arr[$this->position]);

              }

              public function key(){

                     var_dump(__METHOD__);

                     return $this->position;

              }

              public function current(){

                     var_dump(__METHOD__);

                     return $this->arr[$this->position];

              }

              public function next(){

                     var_dump(__METHOD__);

                return ++$this->position;

              }

       }

例子:

       $array = array(1,2,3,3,4);

       $it = new MyIterator($array);

       foreach($it as $key=>$value){

              echo $key.':'.$value.'<br/>';  

       }


使用iteratoraggregate :

class MyIteratorAggregate implements IteratorAggregate{

              protected $arr;

             

              public function __construct($array){

                     $this->arr = $array;

              }

             

              public function getIterator(){

                     return new     MyIterator($this->arr);

              }

       }

例子:

$array = array(1,2,3,3,4);

$it = new MyIteratorAggregate($array);

foreach($it as $key=>$value){

echo $key.':'.$value.'<br/>';

}

对于PHP其他的那些迭代器,实在多不胜数,我反反复复查询官网的手册,终于整理出大体的结构草图,在这里分享给各位吧。

PHP 迭代器 - Perlt - Perlt s Blog

其实,之前我又在思考一个问题,为什么要使用迭代器,我们不可以在foreach中去实现我们想要的处理呢。 其实,以上迭代器它本身的实现都是通过C拓展的,所以自己编写的遍历和PHP自身提供的迭代器是有性能的差异,第二个,因为遍历的是对象而不是数组,面不来我们在遍历的时候遇到不少麻烦,即使我们解决了,也不能确保我们应用到的算法是最好的,而迭代器就是集成了最优化的算法。所以,以后开发中尽量使用迭代器去做想做的事情吧。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值