PHP Conference Japan 2024

SplDoublyLinkedList 類別

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

簡介

SplDoublyLinkedList 類別提供了雙向鏈結串列的主要功能。

類別概要

class SplDoublyLinkedList implements Iterator, Countable, ArrayAccess, Serializable {
/* 常數 */
public const int IT_MODE_LIFO;
public const int IT_MODE_FIFO;
公開 常數 整數 IT_MODE_DELETE;
公開 常數 整數 IT_MODE_KEEP;
/* 方法 */
公開 新增(整數 $index, 混合 $value):
公開 底部(): 混合
公開 計數(): 整數
公開 目前(): 混合
公開 鍵值(): 整數
公開 下一個():
公開 取得偏移量(整數 $index): 混合
公開 設定偏移量(?整數 $index, 混合 $value):
公開 彈出(): 混合
公開 前一個():
公開 推入(混合 $value):
公開 rewind():
公開 serialize(): 字串
公開 shift(): 混合
公開 top(): 混合
公開 unserialize(字串 $data):
公開 unshift(混合 $value):
公開 valid(): 布林
}

預定義常數

迭代方向

SplDoublyLinkedList::IT_MODE_LIFO

列表將以後進先出(LIFO)的順序進行迭代,就像堆疊一樣。

SplDoublyLinkedList::IT_MODE_FIFO

列表將以先進先出(FIFO)的順序進行迭代,就像佇列一樣。

迭代行為

SplDoublyLinkedList::IT_MODE_DELETE

迭代將移除迭代的元素。

SplDoublyLinkedList::IT_MODE_KEEP

迭代不會移除迭代的元素。

目錄

新增註記

使用者貢獻的註記 6 筆註記

Gilles A
11 年前
SplDoublyLinkedList 中的 FIFO 和 LIFO

$list = new SplDoublyLinkedList();
$list->push('a');
$list->push('b');
$list->push('c');
$list->push('d');

echo "FIFO (先進先出) :\n";
$list->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO);
for ($list->rewind(); $list->valid(); $list->next()) {
echo $list->current()."\n";
}

結果

// FIFO (先進先出)
// a
// b
// c
// d

echo "LIFO (後進先出) :\n";
$list->setIteratorMode(SplDoublyLinkedList::IT_MODE_LIFO);
for ($list->rewind(); $list->valid(); $list->next()) {
echo $list->current()."\n";
}

結果

// LIFO (後進先出)
// d
// c
// b
// a
Maaz Rehman
9 年前
/*
php 雙向鏈結串列是一個很棒的資料結構,雙向表示您可以向前和向後遍歷,如果您需要,它可以充當 deque(雙端佇列),
以下是它的運作方式

*/

//實例化一個雙向鏈結串列物件

$dlist=new SplDoublyLinkedList();

//push 將資料插入到串列的尾端
$dlist->push('hiramariam');
$dlist->push('maaz');
$dlist->push('zafar');

/* 串列包含
hiramariam
maaz
zafar
*/

//而 unshift 將物件插入到串列的頂部
$dlist->unshift(1);
$dlist->unshift(2);
$dlist->unshift(3);

/* 現在串列包含
3
2
1
hiramariam
maaz
zafar
*/

//您可以使用 pop 從串列底部刪除項目
$dlist->pop();

/* 現在串列包含
3
2
1
hiramariam
maaz

*/
//您可以使用 shift() 從串列頂部刪除項目
$dlist->shift();

/* 現在串列包含

2
1
hiramariam
maaz

*/

/* 如果您想替換特定索引處的項目,您可以使用名為 add 的方法,請注意,如果您想替換不存在的項目,則會拋出異常 */

$dlist->add(3 , 2.24);

/*
要遍歷列表,我們使用一個簡單的 for 迴圈,如下所示的 rewind() 方法會根據迭代器指向列表的初始位置,valid() 方法會檢查列表是否仍然有效,也就是確保迴圈在到達列表中的最後一個數據後不會一直執行下去,而 next() 方法則會指向列表中的下一個數據。

*/
for($dlist->rewind();$dlist->valid();$dlist->next()){

echo $dlist->current()."<br/>";
}
echo "<br/>";
/*

反向遍歷

*/
$dlist->setIteratorMode(SplDoublyLinkedList::IT_MODE_LIFO);
for($dlist->rewind();$dlist->valid();$dlist->next()){

echo $dlist->current()."<br/>";;
}
dongchao769390531 at 163 dot com
7 年前
<?php
$splDoubleLinkedList
= new SplDoublyLinkedList();
$splDoubleLinkedList->push('a');
$splDoubleLinkedList->push('3');
$splDoubleLinkedList->push('v');
$splDoubleLinkedList->push('1');
$splDoubleLinkedList->push('p');
//首先,我們需要將列表指標重置
$splDoubleLinkedList->rewind();
//使用 while 迴圈,檢查列表是否還有有效節點
while ($splDoubleLinkedList->valid()){
//印出目前節點的值
echo $splDoubleLinkedList->current()."\n";
//將指標移至下一個節點
$splDoubleLinkedList->next();
}
?>
77931774 at qq dot com
3 年前
$list = new SplDoublyLinkedList();

for ($i = 0; $i < 2000001; $i++) {
$list->push($i);
}

$s = microtime(true);

//$res = $list->offsetGet(2000000); // 花費 7 毫秒
$res = $list->offsetGet(0); // 花費 0.07 毫秒
var_dump($res);

$e = microtime(true);

echo ($e - $s) * 1000;
Premysl Karbula
1 年前
一個函式,它會用指定陣列中的項目替換雙向鏈結串列 (DLL) 的某些部分。

<?php

/**
* 將 DLL 的某一部分(由索引和長度指定)替換為指定替換陣列中的項目。
*/
public function dll_splice(
\SplDoublyLinkedList $dll,
int $start,
int $length,
array
$replacement,
):
void {

if (
$start < 0 || ($start + $length) > $dll->count()) {
throw new
\OutOfRangeException("指定範圍無效,無法進行拼接");
}

for (
$i = 0; $i < $length; $i++) {
$dll->offsetUnset($start);
}

foreach (
$replacement as $item) {
$dll->add($start, $item);
}

}

?>
lincoln dot du dot j at gmail dot com
7 年前
$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->push(11); // 使用 push 方法
$a->add(10,12); // add 方法必須搭配索引使用
$a->shift(); // 移除陣列的第一個值
$a->unshift(1); // 新增第一個值

$a->rewind(); // 從第一個元素開始

echo "SplDoublyLinkedList 陣列最後/頂端的值: " . $a->top() ." \n";
echo "SplDoublyLinkedList 陣列的數量: " . $a->count() ." \n";
echo "SplDoublyLinkedList 陣列第一個/底部值: " . $a->bottom() . " \n\n";

while($a->valid()){ // 使用 valid 方法檢查
echo '鍵: ', $a->key(), ' 值: ', $a->current(),"\n"; // 使用 key 和 current 方法
$a->next(); // 使用 next 方法
}

$a->pop(); //移除陣列最後一個值
print_r($a);
$s=$a->serialize();
echo $s;

//輸出
SplDoublyLinkedList 陣列最後/頂端的值: 12
SplDoublyLinkedList 陣列的數量: 11
SplDoublyLinkedList 陣列第一個/底部值: 1

鍵: 0 值: 1
鍵: 1 值: 2
鍵: 2 值: 3
鍵: 3 值: 4
鍵: 4 值: 5
鍵: 5 值: 6
鍵: 6 值: 7
鍵: 7 值: 8
鍵: 8 值: 9
鍵: 9 值: 11
鍵: 10 值: 12
SplDoublyLinkedList 物件
(
[flags:SplDoublyLinkedList:private] => 0
[dllist:SplDoublyLinkedList:private] => 陣列
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
[5] => 6
[6] => 7
[7] => 8
[8] => 9
[9] => 11
)

)
i:0;:i:1;:i:2;:i:3;:i:4;:i:5;:i:6;:i:7;:i:8;:i:9;:i:11;
To Top