细说PHP的foreach循环

       PHP数组本质的结构是HashTable,HashTable既具有双向链表的优点,同时具有能与数组匹敌的操作性能。HashTable是PHP内核实现的基础,用户定义的变量、函数、类,以及资源等容器都是通过HashTable去实现的。在ZendEngine中HashTable的元素其实是一个指针,使得HashTable能包容各种数据类型。

1.PHP的数组类型

     1)索引数组
           索引数组的索引值是整数,以0开始,如array('d','da','p');

     2)关联数组
           关联数组以字符串作为索引值,如array('a'=>'d','b'=>'da','c'=>'p');

     3)混合数组
            混合数组,兼有以上两种类型,如array('d','b'=>'da','c'=>'p');

2.foreach

foreach函数的语法如下:

foreach($arr as $key => $val)
{
    echo "The value of $key is: $val\n";
}

接下来,解析一下foreach的机制。开始执行前,数组内部的指针会自动设置为指向第一个单元,每次循环的时候,将数组的键/值复制到$key/$value,数组内部指针指向下一个单元。由于foreach是数组内部指针操作,比使用for循环效率要高。但是,这也并非绝对的,就是复制$key/$value变量的消耗过大的时候,一般是自定义类,且定义了复杂的__clone方法,使用for循环会更优。


3.类class使用foreach

       在PHP5.0以上,类可以定义迭代操作,继承Iterator接口。

       Iterator接口的定义如下:

       

Iterator extends Traversable {
/* Methods */
abstract public mixed current ( void )
abstract public scalar key ( void )
abstract public void next ( void )
abstract public void rewind ( void )
abstract public boolean valid ( void )
}
     为了类能够进行foreach操作,类必须实现Iterator接口的方法,以下修改后PHP.net上的一个例子。

class myIterator implements Iterator {
    private $array = array(
        "firstelement",
        "secondelement",
        "lastelement",
    );  

    public function __construct() {

    }

    function rewind() {
        reset($this->array);
    }

    function current() {
        return current($this->array);
    }

    function key() {
        return key($this->array);
    }

    function next() {
        return next($this->array);
    }

    function valid() {
        return $this->current()===false?false:true;
    }
}

$it = new myIterator;

foreach($it as $key => $value) {
    var_dump($key, $value);
    echo "\n";
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值