SplDoublyLinkedList::setIteratorMode
(PHP 5 >= 5.3.0, PHP 7)
SplDoublyLinkedList::setIteratorMode — Устанавливает режим итерации
Описание
public void SplDoublyLinkedList::setIteratorMode
( int
$mode
)Список параметров
-
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
-
Направление итерации (одно из двух):
Возвращаемые значения
Эта функция не возвращает значения после выполнения.
- PHP Руководство
- Функции по категориям
- Индекс функций
- Справочник функций
- Другие базовые расширения
- Стандартная библиотека PHP (SPL)
- Структуры данных
- Функция SplDoublyLinkedList::add() - Add/insert a new value at the specified index
- Функция SplDoublyLinkedList::bottom() - Получает узел, находящийся в начале двусвязного списка
- Функция SplDoublyLinkedList::__construct() - Создает новый двусвязный список
- Функция SplDoublyLinkedList::count() - Подсчитывает количество элементов в двусвязном списке
- Функция SplDoublyLinkedList::current() - Возвращает текущий элемент массива
- Функция SplDoublyLinkedList::getIteratorMode() - Возвращает режим итерации
- Функция SplDoublyLinkedList::isEmpty() - Проверяет, является ли двусвязный список пустым
- Функция SplDoublyLinkedList::key() - Возвращает индекс текущего узла
- Функция SplDoublyLinkedList::next() - Перемещает итератор к следующему элементу
- Функция SplDoublyLinkedList::offsetExists() - Проверяет, существует ли запрашиваемый индекс
- Функция SplDoublyLinkedList::offsetGet() - Возвращает значение по указанному индексу
- Функция SplDoublyLinkedList::offsetSet() - Устанавливает значение по заданному индексу $index в $newval
- Функция SplDoublyLinkedList::offsetUnset() - Удаляет значение по указанному индексу $index
- Функция SplDoublyLinkedList::pop() - Удаляет (выталкивает) узел, находящийся в конце двусвязного списка
- Функция SplDoublyLinkedList::prev() - Перемещает итератор к предыдущему элементу
- Функция SplDoublyLinkedList::push() - Помещает элемент в конец двусвязного списка
- Функция SplDoublyLinkedList::rewind() - Возвращает итератор в начало
- Функция SplDoublyLinkedList::serialize() - Сериализует хранилище
- Функция SplDoublyLinkedList::setIteratorMode() - Устанавливает режим итерации
- Функция SplDoublyLinkedList::shift() - Удаляет узел, находящийся в начале двусвязного списка
- Функция SplDoublyLinkedList::top() - Получает узел, находящийся в конце двусвязного списка
- Функция SplDoublyLinkedList::unserialize() - Десериализует хранилище
- Функция SplDoublyLinkedList::unshift() - Вставляет элемент в начало двусвязного списка
- Функция SplDoublyLinkedList::valid() - Проверяет, содержит ли узлы двусвязный список
Коментарии
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"
}
}
}
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.