SplDoublyLinkedList::setIteratorMode

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplDoublyLinkedList::setIteratorMode设置迭代模式

描述

public SplDoublyLinkedList::setIteratorMode(int $mode): int

参数

mode

可以设置两组正交的模式

默认模式是:SplDoublyLinkedList::IT_MODE_FIFO | SplDoublyLinkedList::IT_MODE_KEEP

警告

对于 SplStackSplQueue 类,迭代方向无法更改,它始终为 SplDoublyLinkedList::IT_MODE_FIFO。尝试修改它会导致抛出 RuntimeException

返回值

返回影响迭代的不同模式和标志。

添加笔记

用户贡献的笔记 2 笔记

gregorypatmore at gmail dot com
12 年前
尽管 FIFO/LIFO 和 KEEP/DELETE 选项对之间看似没有关联,但在 setIteratorMode 的行为方面,它们在某种程度上是关联的。这意味着,对 setIteratorMode 的第二次调用将擦除任何先前的设置,即使它们来自另一对。这与对象(SplDoublyLinkedList::IT_MODE_FIFO | SplDoublyLinkedList::IT_MODE_KEEP)的默认设置相结合,这意味着您必须小心,否则可能会遇到问题。

考虑以下示例

<?php
$l
= new SPLDoublyLinkedList();
$l->setIteratorMode(SplDoublyLinkedList::IT_MODE_DELETE);
$l->setIteratorMode(SplDoublyLinkedList::IT_MODE_LIFO);

$mode = $l->getIteratorMode();
var_dump("MODE: $mode");
var_dump("MODE CHECKS");
var_dump(($mode & SplDoublyLinkedList::IT_MODE_LIFO) == SplDoublyLinkedList::IT_MODE_LIFO);
var_dump(($mode & SplDoublyLinkedList::IT_MODE_FIFO) == SplDoublyLinkedList::IT_MODE_FIFO);
var_dump(($mode & SplDoublyLinkedList::IT_MODE_DELETE) == SplDoublyLinkedList::IT_MODE_DELETE);
var_dump(($mode & SplDoublyLinkedList::IT_MODE_KEEP) == SplDoublyLinkedList::IT_MODE_KEEP);

$l->push('A');
$l->push('B');
$l->push('C');
$l->push('D');
$l->rewind();

var_dump("Traversing");
var_dump($l->isEmpty());

var_dump($l->count());
var_dump($l->current());
$l->next();

var_dump($l->count());
var_dump($l->current());
$l->next();

var_dump($l->count());
var_dump($l->current());
$l->next();

var_dump($l->count());
var_dump($l->current());
$l->next();

var_dump($l->count());
var_dump($l->isEmpty());

?>

输出以下内容
#############################
string(7) "MODE: 2"

string(11) "MODE CHECKS"
bool(true) #LIFO (ok)
bool(true) #FIFO (umm...wait a minute)
bool(false)#DELETE (houston... wtf)
bool(true) #KEEP (ok, where's the camera hidden)

string(10) "Traversing"
bool(false)

int(4)
string(1) "D"

int(4)
string(1) "C"

int(4)
string(1) "B"

int(4)
string(1) "A"

int(4)
bool(false)
#############################

基本上,您应该只检查非零标志(LIFO(2) 和 DELETE(1))。由于它是在对内的一个或另一个情况,因此这应该能够帮助您弄清楚一个实例已被设置为的单独模式部分。

示例

<?php
$l
= new SPLDoublyLinkedList();
$l->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO | SplDoublyLinkedList::IT_MODE_DELETE);

$mode = $l->getIteratorMode();

$isLIFO = ($mode & SplDoublyLinkedList::IT_MODE_LIFO) == SplDoublyLinkedList::IT_MODE_LIFO;

$isDELETE = ($mode & SplDoublyLinkedList::IT_MODE_DELETE) == SplDoublyLinkedList::IT_MODE_DELETE;
?>

希望这对某些人有所帮助。
pritiatwork at gmail dot com
12 年前
不同迭代模式的使用

<?php
$doubly
= new SplDoublyLinkedList();
$doubly->push(array('name'=>'Naruto'));
$doubly->push(array('name'=>'Sakura'));
$doubly->push(array('name'=>'Neji'));
$doubly->push(array('name'=>'Sasuke'));
var_dump($doubly);
echo
'<br/> FIFO 遍历<br/>';
$doubly->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO | SplDoublyLinkedList::IT_MODE_KEEP);
$doubly->rewind();
foreach(
$doubly as $key=>$value)
{
echo
'<br/>遍历: '.$key.' '.$value['name'];
}
echo
'<br/>LIFO 遍历 - 保持模式 <br/>';
$doubly->setIteratorMode(SplDoublyLinkedList::IT_MODE_LIFO | SplDoublyLinkedList::IT_MODE_KEEP);
$doubly->rewind();
foreach(
$doubly as $key=>$value)
{
echo
'<br/>遍历: '.$key.' '.$value['name'];
}

echo
'<br/>LIFO 遍历 - 删除模式 <br/>';
$doubly->setIteratorMode(SplDoublyLinkedList::IT_MODE_LIFO | SplDoublyLinkedList::IT_MODE_DELETE);
$doubly->rewind();

foreach(
$doubly as $key=>$value)
{
if(
$key == 2) break;
echo
'<br/>遍历: '.$key.' '.$value['name'];
}
var_dump($doubly);
?>

输出

FIFO 遍历

遍历: 0 Naruto
遍历: 1 Sakura
遍历: 2 Neji
遍历: 3 Sasuke
LIFO 遍历 - 保持模式

遍历: 3 Sasuke
遍历: 2 Neji
遍历: 1 Sakura
遍历: 0 Naruto
LIFO 遍历 - 删除模式

遍历: 3 Sasuke
object(SplDoublyLinkedList)#1 (2) {
["flags":"SplDoublyLinkedList":private]=>
int(3)
["dllist":"SplDoublyLinkedList":private]=>
array(3) {
[0]=>
array(1) {
["name"]=>
string(6) "Naruto"
}
[1]=>
array(1) {
["name"]=>
string(6) "Sakura"
}
[2]=>
array(1) {
["name"]=>
string(4) "Neji"
}
}
}
To Top