PHP Conference Japan 2024

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 則註記

3
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 (嗯...等等)
bool(false)#DELETE (糟糕...怎麼回事)
bool(true) #KEEP (好吧,攝影機藏在哪裡)

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;
?>

希望這對某些人有所幫助。
2
pritiatwork at gmail dot com
13 年前
不同迭代器模式的用法

<?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/>先進先出遍歷<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/>後進先出遍歷 - 保留模式<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/>後進先出遍歷 - 刪除模式<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);
?>

輸出

先進先出遍歷

已遍歷:0 Naruto
已遍歷:1 Sakura
已遍歷:2 Neji
已遍歷:3 Sasuke
後進先出遍歷 - 保留模式

已遍歷:3 Sasuke
已遍歷:2 Neji
已遍歷:1 Sakura
已遍歷:0 Naruto
後進先出遍歷 - 刪除模式

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