我有一组对象。每当我获得该集合的一个元素时,我都想确保在该集合中获得下一个元素,当我到达集合的末尾时,我只是从头开始进行迭代。
例如:
$listOfObjects = new WrappedCollection(array('Apple','Banana','Pikachu'));
$listOfObjects.getElement(); //I get Apple
$listOfObjects.getElement(); //I get Banana
$listOfObjects.getElement(); //I get Pikachu
$listOfObjects.getElement(); //I get Apple
我已经使用SplDoublyLinkedList实现了此功能,但是每次当我需要循环此列表时,我都需要保存迭代器的位置,我确信有一种方法可以实现这个更漂亮的功能。
$this->listOfRunningCampaigns = new \SplDoublyLinkedList();
// Getting element of collection
public function getNextRunningCampaign(): Campaign
{
$this->listOfRunningCampaigns->next();
if ($this->listOfRunningCampaigns->current() !== null)
{
return $this->listOfRunningCampaigns->current();
}
$this->listOfRunningCampaigns->rewind();
return $this->listOfRunningCampaigns->current();
}
这是我遍历集合时必须做的例子:
// Saving current iterator position
$currentIteratorPosition = $this->listOfRunningCampaigns->key();
for ($this->listOfRunningCampaigns->rewind(); $this->listOfRunningCampaigns->valid(); $this->listOfRunningCampaigns->next())
{
//... some action
}
$this->moveRunningCampaignsListIterator($currentIteratorPosition);
// Function that moves iterator
private function moveRunningCampaignsListIterator($index): void
{
for ($this->listOfRunningCampaigns->rewind(); $this->listOfRunningCampaigns->valid(); $this->listOfRunningCampaigns->next())
{
if ($this->listOfRunningCampaigns->key() === $index)
{
break;
}
}
}
在我看来,我实现此方法的方式确实很糟糕,在不久的将来,我将对该集合的元素进行很多不同的操作,并且每次都使用迭代器并不是我想要的方式工作。您能建议一些实现此目的的方法吗?
答案 0 :(得分:0)
为什么您不只是使用next()
?此内置函数将为您完成其余的数组指针操作。
如果您想开发一个数组包装器,我认为您应该看看Doctrine\Common\Collections\ArrayCollection
或直接使用它,他们做得很好,并且可以通过Composer获得它。