PHP:如何制作包装包装,每次我调用包装时都会返回包装的下一个元素

时间:2019-01-18 09:26:27

标签: php algorithm collections

我有一组对象。每当我获得该集合的一个元素时,我都想确保在该集合中获得下一个元素,当我到达集合的末尾时,我只是从头开始进行迭代。

例如:

    $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;
            }
        }
    }

在我看来,我实现此方法的方式确实很糟糕,在不久的将来,我将对该集合的元素进行很多不同的操作,并且每次都使用迭代器并不是我想要的方式工作。您能建议一些实现此目的的方法吗?

1 个答案:

答案 0 :(得分:0)

为什么您不只是使用next()?此内置函数将为您完成其余的数组指针操作。

如果您想开发一个数组包装器,我认为您应该看看Doctrine\Common\Collections\ArrayCollection或直接使用它,他们做得很好,并且可以通过Composer获得它。