PHP迭代器模式

本文介绍PHP中迭代器的实现方式,通过自定义类实现Iterator接口,完成数组的遍历及数据库记录的迭代处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

迭代器:类继承PHP的Iterator操作,批量操作

    1 迭代器模式 在不需要了解内部实现的前提下,遍历一个聚合对象的内部元素

    2 相比传统的变成模式,迭代器模式可以隐藏遍历元素的所需操作

    3 允许对象以自己的方式迭代内部的数据,从而使它可以被循环访问

接口Iterator


  1. Iterator extends Traversable {  
  2.     //返回当前索引游标指向的元素  
  3.     abstract public mixed current ( void )  
  4.     //返回当前索引游标指向的键  
  5.     abstract public scalar key ( void )  
  6.     //移动当前索引游标到下一元素  
  7.     abstract public void next ( void )  
  8.     //重置索引游标  
  9.     abstract public void rewind ( void )  
  10.     //判断当前索引游标指向的元素是否有效  
  11.     abstract public boolean valid ( void )  
  12. }  
<?php
/**
 * Created by PhpStorm.
 * User: wangkai
 * Date: 2018/3/16
 * Time: 上午9:29
 */

class TestIterator implements Iterator {

    /*
     * 定义要进行迭代的数组
     */
    private $_test = array('dog', 'cat', 'pig');

    /*
     * 索引游标
     */
    private $_key = 0;

    /*
     * 执行步骤
     */
    private $_step = 0;

    /**
     * 将索引游标指向初始位置
     *
     * @see TestIterator::rewind()
     */
    public function rewind() {
        echo '第'.++$this->_step.'步:执行 '.__METHOD__.'<br>';
        $this->_key = 0;
    }

    /**
     * 判断当前索引游标指向的元素是否设置
     *
     * @see TestIterator::valid()
     * @return bool
     */
    public function valid() {
        echo '第'.++$this->_step.'步:执行 '.__METHOD__.'<br>';
        return isset($this->_test[$this->_key]);
    }

    /**
     * 将当前索引指向下一位置
     *
     * @see TestIterator::next()
     */
    public function next() {
        echo '第'.++$this->_step.'步:执行 '.__METHOD__.'<br>';
        $this->_key++;
    }
    /**
     * 返回当前索引游标指向的元素的值
     *
     * @see TestIterator::current()
     * @return value
     */
    public function current() {
        echo '第'.++$this->_step.'步:执行 '.__METHOD__.'<br>';
        return $this->_test[$this->_key];
    }

    /**
     * 返回当前索引值
     *
     * @return key
     * @see TestIterator::key()
     */
    public function key() {
        echo '第'.++$this->_step.'步:执行 '.__METHOD__.'<br>';
        return $this->_key;
    }
}

$iterator = new TestIterator();
foreach($iterator as $key => $value){
    echo "输出索引为{$key}的元素".":$value".'<br><br>';
}
?>  

另一个例子:数据表对象

 

class AllUser implements \Iterator
{
    protected $index = 0;
    protected $data = [];

    public function __construct()
    {
        $link = mysqli_connect('192.168.0.91', 'root', '123', 'xxx');
        $rec = mysqli_query($link, 'select id from doc_admin');
        $this->data = mysqli_fetch_all($rec, MYSQLI_ASSOC);
    }

    //1 重置迭代器
    public function rewind()
    {
        $this->index = 0;
    }
xxx
    //2 验证迭代器是否有数据
    public function valid()
    {
        return $this->index < count($this->data);
    }

    //3 获取当前内容
    public function current()
    {
        $id = $this->data[$this->index];
        return User::find($id);
    }

    //4 移动key到下一个
    public function next()
    {
        return $this->index++;
    }


    //5 迭代器位置key
    public function key()
    {
        return $this->index;
    }
}

//实现迭代遍历用户表
$users = new AllUser();
//可实时修改
foreach ($users as $user){
    $user->add_time = time();
    $user->save();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值