SplDoublyLinkedList::valid
(PHP 5 >= 5.3.0)
SplDoublyLinkedList::valid — Check whether the doubly linked list contains more nodes
Description
public bool SplDoublyLinkedList::valid
( void
)
Checks if the doubly linked list contains any more nodes.
Parameters
This function has no parameters.
Return Values
Returns TRUE
if the doubly linked list contains any more nodes, FALSE
otherwise.
- 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() - Проверяет, содержит ли узлы двусвязный список
Коментарии
$a = new SplDoublyLinkedList;
$arr=[1,2,3,4,5,6,7,8,9];
for($i=0;$i<count($arr);$i++){
$a->add($i,$arr[$i]);
}
$a->rewind();
while($a->valid()){
echo 'key ', $a->key(), ' value ', $a->current(),"\n";
$a->next();
}
The docs say "Check whether the doubly linked list contains more nodes". I do not believe this is correct.
Example:
$dlist = new SplDoublyLinkedList;
$data=[1,2,3,4,5];
foreach($data as $d)
$dlist->push($d);
$dlist->rewind();
for($i=0;$i<6;$i++)
{
$currentValue = $dlist->current();
$currentValid = $dlist->valid();
$status = $currentValid ? 'True' : 'False';
echo 'Current value is: ' . $currentValue . ' Valid status is: ' . $status . "\n";
$dlist->next();
}
Output:
Current value is: 1 Valid status is: True
Current value is: 2 Valid status is: True
Current value is: 3 Valid status is: True
Current value is: 4 Valid status is: True
Current value is: 5 Valid status is: True
Current value is: Valid status is: False
Note that when we are on the last node of the list, value = 5, the valid() function returns true. Yet we are on the last node of the list, and there are no more nodes. If the valid() function were checking to see if there were any more nodes on the list, it would return false, not true.
If you look at the docs for Iterator::valid, they say "Checks if current position is valid". I believe that is in fact what valid() does, it checks to see if the *current* position is valid, *not* if there are any more nodes.
Be aware of this or it will bite you. You can happily iterate to the end of the list, run valid(), think there is one more node, do a next(), grab the value, and you get null instead of the last node of the list.