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
返回类型。使用这些方法获取值会触发副作用,并使代码不可预测是的,扩展内置类并修改方法是一种糟糕的做法,据我所知也是如此。但是我不会从那里退回任何东西,即使我退回了,它也会被忽略。根据文件,你介意在这里看一下吗?