zoukankan      html  css  js  c++  java
  • 看PHP在内部迭代的动作

    以下我们来了解怎样实现一个自己定义的迭代器,然后再開始慢慢理解迭代器的内部工作原理。先来看一个官方的样例:

    <?

    php class myIterator implements Iterator { private $position = 0; private $array = array( "first_element", "second_element", "last_element", ); public function __construct() { $this->position = 0; } function rewind() { var_dump(__METHOD__); $this->position = 0; } function current() { var_dump(__METHOD__); return $this->array[$this->position]; } function key() { var_dump(__METHOD__); return $this->position; } function next() { var_dump(__METHOD__); ++$this->position; } function valid() { var_dump(__METHOD__); return isset($this->array[$this->position]); } } $it = new myIterator; foreach($it as $key => $value) { echo '输出键值:'; var_dump($key, $value); //echo $key; echo " "; }


    程序执行输出:

    string(18) "myIterator::rewind"
    string(17) "myIterator::valid"
    string(19) "myIterator::current"
    string(15) "myIterator::key"
    输出键值:int(0)
    string(13) "first_element"
    
    string(16) "myIterator::next"
    string(17) "myIterator::valid"
    string(19) "myIterator::current"
    string(15) "myIterator::key"
    输出键值:int(1)
    string(14) "second_element"
    
    string(16) "myIterator::next"
    string(17) "myIterator::valid"
    string(19) "myIterator::current"
    string(15) "myIterator::key"
    输出键值:int(2)
    string(12) "last_element"
    
    string(16) "myIterator::next"
    string(17) "myIterator::valid"

    一般的迭代器内部须要以下的方法:

    • Iterator::current — Return the current element 返回当前元素
    • Iterator::key — Return the key of the current element 返回当前元素的键
    • Iterator::next — Move forward to next element 移向下一个元素
    • Iterator::rewind — Rewind the Iterator to the first element 又一次回到第一个元素
    • Iterator::valid — Checks if current position is valid 检查当前位置的有效性

    假设不是非常清楚迭代器的内容工作流程。能够查看以下的迭代器对数组的遍历过程:

    <?

    php /** * @author nicesunboy@gmail.com */ class MyIterator implements Iterator { private $var = array(); public function __construct($array) { if (is_array($array)) { $this->var = $array; } } public function rewind() { echo "倒回第一个元素 "; reset($this->var); } public function current() { $var = current($this->var); echo "当前元素: $var "; return $var; } public function key() { $var = key($this->var); echo "当前元素的键: $var "; return $var; } public function next() { $var = next($this->var); echo "移向下一个元素: $var "; return $var; } public function valid() { $var = $this->current() !== false; echo "检查有效性: {$var} "; return $var; } } $values = array(1,2,3); $it = new MyIterator($values); foreach ($it as $k => $v) { print "此时键值对 -- key $k: value $v "; }


    程序执行结果:

    倒回第一个元素
    当前元素: 1
    检查有效性: 1
    当前元素: 1
    当前元素的键: 0
    此时键值对 -- key 0: value 1
    
    移向下一个元素: 2
    当前元素: 2
    检查有效性: 1
    当前元素: 2
    当前元素的键: 1
    此时键值对 -- key 1: value 2
    
    移向下一个元素: 3
    当前元素: 3
    检查有效性: 1
    当前元素: 3
    当前元素的键: 2
    此时键值对 -- key 2: value 3
    
    移向下一个元素: 
    当前元素: 
    检查有效性: 

    今天,它是很清楚?



    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    maven 配置报错 JAVA_HOME not found in your environment
    file控件change事件触发问题
    自己动手写easyui的checkbox
    json数组传递到后台controller
    yii2 添加模块过程
    YII框架中php入口文件隐藏
    YII框架路由和URL生成
    Node.js脚本杀掉占用端口的进程
    Java单例模式的6种写法
    HTTPS时代已来,你做好准备了吗?
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4682191.html
Copyright © 2011-2022 走看看