Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php SPL InfiniteIterator不能与next或prev一起工作_Php_Iterator_Infinite Loop_Php 7.2_Spl - Fatal编程技术网

Php SPL InfiniteIterator不能与next或prev一起工作

Php SPL InfiniteIterator不能与next或prev一起工作,php,iterator,infinite-loop,php-7.2,spl,Php,Iterator,Infinite Loop,Php 7.2,Spl,我想无限地覆盖一个数组,就像圆形数组一样 我使用InfiniteIterator进行以下设置,它无限地迭代$players。但实际上,我想知道下一个玩家和前一个玩家,就像下面这样 $players = new InfiniteIterator(new ArrayIterator(['Shobi', 'Jomit'])); foreach ($players as $player) { echo $player; // current player name comes properly

我想无限地覆盖一个数组,就像圆形数组一样

我使用
InfiniteIterator
进行以下设置,它无限地迭代
$players
。但实际上,我想知道下一个玩家和前一个玩家,就像下面这样

$players = new InfiniteIterator(new ArrayIterator(['Shobi', 'Jomit']));

foreach ($players as $player) {
    echo $player; // current player name comes properly infinetly
    echo next($players); // next player should come
    echo current($players); // current player should come
    echo prev($players); //previous player should come
}
但是
next()
prev()
始终返回null

从文档中,我可以看到这些方法正在返回void,但是有什么方法可以扩展无穷运算符并实现所需的机制吗

如何使
next()
prev()
与无穷运算符一起工作


Edit
current()
返回当前项(意思是,它在逻辑中正常工作)

如果不使用迭代器,您只需使用数组和指向“当前”项的指针,然后使用
while(true)
循环即可继续运行(您始终可以添加一个
break
来停止它以进行测试或满足某些条件)。逻辑的各个部分检查当前播放器是否是最后一个播放器-因此下一个播放器是开始播放器- 或者如果它是第一个项目,那么前一个项目就是结束项目。同时,增量在到达结束时重置,然后重新开始

$players = ['Shobi', 'Jomit'];
$playerKey = 0;
$playerCount = count($players);
while(true) {
    echo $players[($playerKey+1)%$playerCount].PHP_EOL; // next player
    echo $players[$playerKey].PHP_EOL; // current player
    echo $players[($playerKey>0)?$playerKey-1:$playerCount-1].PHP_EOL; //previous player
    $playerKey = ( $playerKey+1 == $playerCount )?0:$playerKey+1;
}

您可以使用PHP迭代器并执行以下操作:

$array = ['Shobi', 'Jomit', 'John', 'Jane', 'Smith'];

// Use NoRewindIterator to prevent MultipleIterator rewinding.
$players1 = new NoRewindIterator(new InfiniteIterator(new ArrayIterator($array)));
// Go to the end of array, i.e. set prev player.
for ($i = 0, $size = count($array); $i < $size - 1; $i++) {
    $players1->next();
}

$players2 = new InfiniteIterator(new ArrayIterator($array));
$players2->next();

// Use NoRewindIterator to prevent MultipleIterator rewinding.
$players3 = new NoRewindIterator(new InfiniteIterator(new ArrayIterator($array)));
$players3->next(); // Go to the second player, i.e. next player

// MultipleIterator will traverse three iterators at once.
// Since the pointer in each iterator differs in one position, we will have prev, curr and next.
$players = new MultipleIterator(MultipleIterator::MIT_NEED_ALL|MultipleIterator::MIT_KEYS_ASSOC);
$players->attachIterator($players1, 'prev');
$players->attachIterator($players2, 'curr');
$players->attachIterator($players3, 'next');

$i = 0;
foreach ($players as $player) {
    print_r($player);

    if (++$i >= 10) {
        break;
    }
}
$array=['Shobi','Jomit','John','Jane','Smith'];
//使用NOREWINDIATOR防止多路复用器倒带。
$players1=新的NOREWINDIATOR(新的无穷运算符(新的数组计数器($array));
//转到数组末尾,即设置prev player。
对于($i=0,$size=count($array);$i<$size-1;$i++){
$players1->next();
}
$players2=新的无穷运算符(新的数组运算符($array));
$players2->next();
//使用NOREWINDIATOR防止多路复用器倒带。
$players3=新的NOREWINDIATOR(新的无穷运算符(新的数组计数器($array));
$players3->next();//转到第二个玩家,即下一个玩家
//乘法器将同时遍历三个迭代器。
//由于每个迭代器中的指针在一个位置上不同,因此我们将使用prev、curr和next。
$players=新的乘法器(乘法器::MIT_NEED_ALL |乘法器::MIT_KEYS_ASSOC);
$players->attachIterator($players1,'prev');
$players->attachIterator($players2,'curr');
$players->attachIterator($players3,'next');
$i=0;
foreach($player作为$player){
打印(播放器);
如果(++$i>=10){
打破
}
}

请看。

发布了我最终得出的答案

无限迭代器在我的情况下并没有真正起作用。特别是因为我无法使用
prev()
函数将指针移回。所以我实现了,并相应地重写了
next
prev
方法

因此,当调用
next()
时,如果它位于数组的末尾,它会将指针倒带到开头,同样,如果调用
prev()
并且指针已经在开头,它会将指针移动到内部数组的末尾。这对我来说非常有效

相关代码

<?php

class CircularIterator implements Iterator
{
    ...
    ...
    public function next()
    {
        next($this->entries);
        if (!$this->current()) {
            $this->rewind();
        }
    }

    public function prev()
    {
        prev($this->entries);
        if (!$this->current()) {
            $this->end();
        }
    }
  ....
  ....
}

你需要使用
无穷运算符吗
或者另一种方法可以吗?另一种方法可以,唯一的问题是我需要能够无限地迭代它,我第一手就发现了无穷运算符,所以我想使用它:)很抱歉延迟响应,事实上,这是我提出的第一个解决方案,但它看起来有点混乱,因此,我至少尝试使用一种看起来更干净的解决方案+1如果你已经用自己的方法解决了问题,那么就发布一个答案,以便其他人可以从中学习。当然,我会在一个时刻发布这是很多迭代器:P,实际上,我实现了迭代器接口,并调整了
next()
prev()
方法,以
适当地回放
重置
底层数组。我将发布一个答案soon@Shobi,请考虑到
next
prev
方法有副作用——它们移动内部指针。这就是为什么他们没有按设计返回任何内容,并且具有
void
返回类型。使用这些方法获取值会触发副作用,并使代码不可预测是的,扩展内置类并修改方法是一种糟糕的做法,据我所知也是如此。但是我不会从那里退回任何东西,即使我退回了,它也会被忽略。根据文件,你介意在这里看一下吗?