【问题标题】:accessing value of next() and rewind() in a PHP iterator run in a foreach loop在 foreach 循环中运行的 PHP 迭代器中访问 next() 和 rewind() 的值
【发布时间】:2011-04-06 01:19:44
【问题描述】:

在 wikipedia 中看到了这个,当您通过 foreach 循环遍历迭代器时会发生这种情况:

这些方法都在一个 完整的 foreach( $object as $key=>$value ) 序列。方法 按以下顺序执行:

rewind() 
while valid() {
    current() in $value 
    key() in $key 
    next()
} 
End of Loop

我想知道如何访问 next() 和 rewind() 的值。有什么想法吗?

更新:从 foreach 循环内部访问它们

【问题讨论】:

  • 为什么要访问它们?这将抛出内部指针,并可能提前结束循环/无限循环。如果出于学习目的,在 while 循环中使用它们会更有意义。
  • 在我使用的数据库库中,我打算从查询中访问上一行和下一行项目。有没有更好的方法来做到这一点?
  • 可能。它是哪个数据库库?还是您的意思是您正在创建自己的?
  • 我正在使用 KOHana 的数据库库

标签: php object iterator foreach


【解决方案1】:

你怎么看?

for ($i =0; $i < count($arr); $i++) {

    $last = ($i == 0) ? null : $arr[$i-1];
    $next = (isset($arr[$i+1]) ? $arr[$i+1] : null;
    $current = $arr[$i];

    //...

}

【讨论】:

  • 一般不起作用(键可能不是整数,也可能不是以 0 开头并且是连续的)。
【解决方案2】:

你不能。要触发reset,需要重新进入循环,调用next,需要进入下一次迭代。

所以最接近的(PHP 5.3)是这样的:

label:
foreach ($var as $k => $v) {

    /* ... */
    goto label; //re-enter loop

    /* ... */
    continue; //force going to the next iteration

    /* ... */
}

如果您直接使用迭代器,则可以使用这些调用:

$r = 0; $s = 0;
$it = new ArrayIterator(array("a" => 3, "b" => 5, "c" => 7));
foreach ($it as $k => $v) {
    echo "$k => $v\n";
    if ($s == 0) {
        $s = 1;
        $it->next(); //jump over one iteration
    } else if ($r == 0) {
        $r = 1;
        $it->rewind();
    }
}

给予:

一个 => 3 c => 7 b => 5 c => 7

【讨论】:

    【解决方案3】:

    如果它实现了Iterator 接口,您可以自己调用这些方法,但它们有影响。

    rewindnext 都设置了指针在被迭代的数据集中的位置......它们实际上并不返回元素或索引。所以调用其中任何一个都会搞砸你的循环。

    current 将返回您在循环中已有的相同变量 - 即。当前迭代的元素。 key 将返回集合中该项目的索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-23
      • 2016-06-19
      • 2010-11-01
      • 2015-02-16
      • 2015-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多