Despite the seeming unrelated-ness between the FIFO/LIFO and the KEEP/DELETE option pairs, in respect to the behavior of setIteratorMode they are in some way linked. Meaning, a second call to setIteratorMode will erase any previous settings even if they are from the other pair. This, coupled with the default settings for the object (SplDoublyLinkedList::IT_MODE_FIFO | SplDoublyLinkedList::IT_MODE_KEEP), means you have to be careful or you can run into trouble
Consider the following example:
<?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());
?>
Which outputs the following:
#############################
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)
#############################
Basically, you should just check the non-zero flags (LIFO(2) and DELETE(1)). Since it's an either/or situation within the pairs, this should be able to help you figure out the separate mode pieces an instance has been set to.
example:
<?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;
?>
hope this helps someone.SplDoublyLinkedList::setIteratorMode
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
SplDoublyLinkedList::setIteratorMode
Референца за `spldoublylinkedlist.setiteratormode.php` со подобрена типографија и навигација.
SplDoublyLinkedList::setIteratorMode
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
SplDoublyLinkedList::setIteratorMode — Го поставува режимот на итерација
Параметри
mode-
Постојат два ортогонални сета на режими што можат да се постават:
-
Насоката на итерацијата (едната или другата):
SplDoublyLinkedList::IT_MODE_LIFO(Стил на стек)SplDoublyLinkedList::IT_MODE_FIFO(Стил на редица)
-
Однесувањето на итераторот (едната или другата):
SplDoublyLinkedList::IT_MODE_DELETE(Елементите се бришат од итераторот)SplDoublyLinkedList::IT_MODE_KEEP(Елементите се поминуваат од итераторот)
Стандардниот режим е:
SplDoublyLinkedList::IT_MODE_FIFO|SplDoublyLinkedList::IT_MODE_KEEPГи ескејпува специјалните знаци во стринг за употреба во SQL изјаваНасоката на итерација не може да се промени за SplStack and SplQueue класи, секогаш е
SplDoublyLinkedList::IT_MODE_FIFO. Обидот да се промени ќе резултира со RuntimeException што ќе биде фрлен. -
Насоката на итерацијата (едната или другата):
Вратени вредности
Ги враќа различните режими и знаменца што влијаат на итерацијата.
Белешки од корисници 2 забелешки
Usage of different Iterator Mode
<?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 Traversing<br/>';
$doubly->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO | SplDoublyLinkedList::IT_MODE_KEEP);
$doubly->rewind();
foreach($doubly as $key=>$value)
{
echo '<br/>Traversed:'.$key.' '.$value['name'];
}
echo '<br/>LIFO Traversing - Keep mode <br/>';
$doubly->setIteratorMode(SplDoublyLinkedList::IT_MODE_LIFO | SplDoublyLinkedList::IT_MODE_KEEP);
$doubly->rewind();
foreach($doubly as $key=>$value)
{
echo '<br/>Traversed:'.$key.' '.$value['name'];
}
echo '<br/>LIFO Traversing - Delete mode <br/>';
$doubly->setIteratorMode(SplDoublyLinkedList::IT_MODE_LIFO | SplDoublyLinkedList::IT_MODE_DELETE);
$doubly->rewind();
foreach($doubly as $key=>$value)
{
if($key == 2) break;
echo '<br/>Traversed:'.$key.' '.$value['name'];
}
var_dump($doubly);
?>
Output:
FIFO Traversing
Traversed:0 Naruto
Traversed:1 Sakura
Traversed:2 Neji
Traversed:3 Sasuke
LIFO Traversing - Keep mode
Traversed:3 Sasuke
Traversed:2 Neji
Traversed:1 Sakura
Traversed:0 Naruto
LIFO Traversing - Delete mode
Traversed: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"
}
}
}