問(wèn)題描述
如果我有一個(gè)實(shí)現(xiàn) Iterator
接口的類,我可以手動(dòng)控制 foreach
循環(huán)中的迭代方式.但是還有其他方法可以讓我的對(duì)象表現(xiàn)得像一個(gè)數(shù)組嗎?
If I have a class that implements the Iterator
interface, I can manually control how iteration in a foreach
loop. But are there other ways in which I could make my object behave like an array?
例如,假設(shè)我有一個(gè)實(shí)現(xiàn) Iterator
的類 Guestbook
,這樣我就可以迭代 foreach (new Guestbook() as $entry)代碼>.但是,如果我想顛倒順序怎么辦?
For instance, let's say I have a class Guestbook
which implements Iterator
, so that I can iterate foreach (new Guestbook() as $entry)
. But what if I want to, say, reverse the order?
foreach (array_reverse(new Guestbook()) as $entry)
肯定不行,因?yàn)?array_reverse
只接受一個(gè)數(shù)組.
foreach (array_reverse(new Guestbook()) as $entry)
definitely won't work, because array_reverse
will only accept an array.
我想我想問(wèn)的是,我可以將 Iterator
用于更多的 foreach
循環(huán)嗎?
I guess what I'm asking is, can I use Iterator
for more than just foreach
loops?
謝謝.
推薦答案
迭代器接口的目的 是為了讓你的對(duì)象在 foreach 循環(huán)中使用,它不是為了讓你的對(duì)象像一個(gè)數(shù)組.如果您想要一些像數(shù)組一樣的東西,請(qǐng)使用數(shù)組.
The purpose of the Iterator interface is to allow your object to be used in a foreach loop, it is not intended to make your object act like an array. If you want something that acts like an array, use an array.
您始終可以使用iterator_to_array 函數(shù)將您的對(duì)象轉(zhuǎn)換為數(shù)組,但您無(wú)法逆轉(zhuǎn)該過(guò)程.
You can always turn your object into an array by using the iterator_to_array function, but you can't reverse that process.
如果您認(rèn)為需要反轉(zhuǎn)可迭代對(duì)象中元素的順序,那么您可以創(chuàng)建一個(gè) reverse() 方法,該方法可能在內(nèi)部使用 array_reverse().像這樣:-
If you see the need for reversing the order of the elements in your iterable object, then you could create a reverse() method that, possibly, uses array_reverse() internally. Something like this:-
class Test implements Iterator
{
private $testing = [0,1,2,3,4,5,6,7,8,9,10];
private $index = 0;
public function current()
{
return $this->testing[$this->index];
}
public function next()
{
$this->index ++;
}
public function key()
{
return $this->index;
}
public function valid()
{
return isset($this->testing[$this->key()]);
}
public function rewind()
{
$this->index = 0;
}
public function reverse()
{
$this->testing = array_reverse($this->testing);
$this->rewind();
}
}
$tests = new Test();
var_dump(iterator_to_array($tests));
$tests->reverse();
var_dump(iterator_to_array($tests));
輸出:-
array (size=11)
0 => int 0
1 => int 1
2 => int 2
3 => int 3
4 => int 4
5 => int 5
6 => int 6
7 => int 7
8 => int 8
9 => int 9
10 => int 10
array (size=11)
0 => int 10
1 => int 9
2 => int 8
3 => int 7
4 => int 6
5 => int 5
6 => int 4
7 => int 3
8 => int 2
9 => int 1
10 => int 0
我寫(xiě)了代碼是為了在發(fā)布之前向自己證明它可以工作,并認(rèn)為我不妨把它扔到答案中.
I wrote the code to prove to myself that it would work before posting and thought I might as well throw it into the answer.
這篇關(guān)于將實(shí)現(xiàn) Iterator 的 PHP 類視為數(shù)組的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,也希望大家多多支持html5模板網(wǎng)!