使链表可迭代

到目前为止,我们已经看到可以在方法内部使用 while 循环遍历链表的每个节点。如果我们需要仅使用链表对象从外部遍历呢?这是很有可能实现的。PHP 有一个非常直观的迭代器接口,允许任何外部迭代器在内部遍历对象。Iterator 接口提供了以下方法:

  • Current:返回当前元素

  • Next:前进到下一个元素

  • Key:返回当前元素的键值

  • Rewind:将迭代器倒退至第一个元素

  • Valid:检查当前位置是否有效

private $_currentNode = NULL;
private $_currentPosition = 0;

$_currentNode 属性将在迭代过程中跟踪当前节点,而 $_currentPosition 属性将在迭代过程中跟踪当前位置。我们还需要确保我们的 LinkedList 类也实现了 Iterator 接口。它看起来是这样的:

class LinkedList implements Iterator{
}

现在,让我们来实现这五个新方法,使我们的链表对象可以迭代。这五个方法的实现非常直接简单。代码如下:

Unresolved include directive in modules/ROOT/pages/ch03/ch3-05.adoc - include::example$Chapter03/1.php[]

现在,我们有了一个可迭代的列表。这意味着我们现在可以使用 foreach 循环或任何其他迭代过程遍历我们的链表对象。现在,如果我们编写以下代码,就可以看到所有的书名:

foreach ($BookTitles as $title) {
    echo $title . "\n";
}

另一种方法是使用 iterable 接口中的 rewindvalidnextcurrent 方法。其输出结果与前面的代码相同:

for ($BookTitles->rewind(); $BookTitles->valid();
    $BookTitles->next()) {
    echo $BookTitles->current() . "\n";
}