使链表可迭代
到目前为止,我们已经看到可以在方法内部使用 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
接口中的 rewind
、valid
、next
和 current
方法。其输出结果与前面的代码相同:
for ($BookTitles->rewind(); $BookTitles->valid();
$BookTitles->next()) {
echo $BookTitles->current() . "\n";
}