💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、豆包、星火、月之暗面及文生图、文生视频 广告
# SplDoublyLinkedList(双向链表) ## **[SplDoublyLinkedList](https://www.php.net/manual/zh/class.spldoublylinkedlist.php)** > 双链表是一种重要的线性存储结构,对于双链表中的每个节点,不仅仅存储自己的信息,还要保存前驱和后继节点的地址 ``` <pre class="calibre10">``` SplDoublyLinkedList implements <span class="token4">Iterator</span> <span class="token3">,</span> ArrayAccess <span class="token3">,</span> Countable <span class="token3">{</span> <span class="token">/* 常量 */</span> const integer IT_MODE_LIFO <span class="token1">=</span> <span class="token6">2</span> <span class="token3">;</span><span class="token">//列表将以后进先出的顺序迭代,就像堆栈一样。</span> const integer IT_MODE_FIFO <span class="token1">=</span> <span class="token6">0</span> <span class="token3">;</span> <span class="token">//列表将按先进先出的顺序迭代,就像队列一样</span> const integer IT_MODE_DELETE <span class="token1">=</span> <span class="token6">1</span> <span class="token3">;</span> <span class="token">//迭代将删除迭代的元素</span> const integer IT_MODE_KEEP <span class="token1">=</span> <span class="token6">0</span> <span class="token3">;</span><span class="token">//迭代不会删除迭代的元素。</span> <span class="token">/* 方法 */</span> public __construct <span class="token3">(</span> void <span class="token3">)</span> public void add <span class="token3">(</span> mixed $index <span class="token3">,</span> mixed $newval <span class="token3">)</span> <span class="token">//在指定的索引处添加/插入新值 </span> public mixed bottom <span class="token3">(</span> void <span class="token3">)</span> <span class="token">//返回双链表的尾部节点 即最后一个</span> public int count <span class="token3">(</span> void <span class="token3">)</span> <span class="token">//双联表元素的个数 Countable </span> public mixed current <span class="token3">(</span> void <span class="token3">)</span> <span class="token">//返回当前记录节点索引的值 超出范围返回空 Iterator</span> public int getIteratorMode <span class="token3">(</span> void <span class="token3">)</span> <span class="token">//获取迭代模式</span> public bool isEmpty <span class="token3">(</span> void <span class="token3">)</span> <span class="token">//检测双链表是否为空</span> public mixed key <span class="token3">(</span> void <span class="token3">)</span> <span class="token">//当前节点索引 Iterator</span> public void next <span class="token3">(</span> void <span class="token3">)</span> <span class="token">//移到下条记录 超过 Iterator</span> public bool offsetExists <span class="token3">(</span> mixed $index <span class="token3">)</span> <span class="token">//指定index处节点是否存在 ArrayAccess </span> public mixed offsetGet <span class="token3">(</span> mixed $index <span class="token3">)</span> <span class="token">//获取指定index处节点值 ArrayAccess </span> public void offsetSet <span class="token3">(</span> mixed $index <span class="token3">,</span> mixed $newval <span class="token3">)</span> <span class="token">//设置指定index处值 ArrayAccess </span> public void offsetUnset <span class="token3">(</span> mixed $index <span class="token3">)</span> <span class="token">//删除指定index处节点 ArrayAccess </span> public mixed pop <span class="token3">(</span> void <span class="token3">)</span> <span class="token">//从双链表的尾部弹出元素 并返回该元素</span> public void prev <span class="token3">(</span> void <span class="token3">)</span> <span class="token">//移到上条记录</span> public void push <span class="token3">(</span> mixed $value <span class="token3">)</span> <span class="token">//添加元素到双链表的尾部</span> public void rewind <span class="token3">(</span> void <span class="token3">)</span> <span class="token">//将指针指向迭代开始处 Iterator</span> public string serialize <span class="token3">(</span> void <span class="token3">)</span> <span class="token">//序列化存储</span> public void setIteratorMode <span class="token3">(</span> int $mode <span class="token3">)</span> <span class="token">//设置迭代模式</span> public mixed shift <span class="token3">(</span> void <span class="token3">)</span> <span class="token">//双链表的头部移除元素</span> public mixed top <span class="token3">(</span> void <span class="token3">)</span> <span class="token">//双链表的头部节点即第一个</span> public void unserialize <span class="token3">(</span> string $serialized <span class="token3">)</span> <span class="token">//反序列化</span> public void unshift <span class="token3">(</span> mixed $value <span class="token3">)</span> <span class="token">//双链表的头部添加元素</span> public bool valid <span class="token3">(</span> void <span class="token3">)</span> <span class="token">//检查双链表是否还有节点 Iterator</span> <span class="token3">}</span> ``` ``` ## **用法:** ``` <pre class="calibre17">``` <span class="token1"><</span><span class="token1">?</span>php $list <span class="token1">=</span> <span class="token5">new</span> <span class="token4">SplDoublyLinkedList</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> <span class="token">//添加元素到双链表的尾部</span> $list<span class="token1">-</span><span class="token1">></span><span class="token4">push</span><span class="token3">(</span><span class="token2">'a'</span><span class="token3">)</span><span class="token3">;</span> $list<span class="token1">-</span><span class="token1">></span><span class="token4">push</span><span class="token3">(</span><span class="token2">'b'</span><span class="token3">)</span><span class="token3">;</span> $list<span class="token1">-</span><span class="token1">></span><span class="token4">push</span><span class="token3">(</span><span class="token2">'c'</span><span class="token3">)</span><span class="token3">;</span> $list<span class="token1">-</span><span class="token1">></span><span class="token4">push</span><span class="token3">(</span><span class="token2">'d'</span><span class="token3">)</span><span class="token3">;</span> <span class="token">//$this->dllist=[a.b.c,d]</span> <span class="token">//移除双链表的尾部的一个元素</span> $list<span class="token1">-</span><span class="token1">></span><span class="token4">pop</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> <span class="token">//$this->dllist=[a,b,c]</span> <span class="token">//双链表的头部添加元素</span> $list<span class="token1">-</span><span class="token1">></span><span class="token4">unshift</span><span class="token3">(</span><span class="token2">'1'</span><span class="token3">)</span><span class="token3">;</span> $list<span class="token1">-</span><span class="token1">></span><span class="token4">unshift</span><span class="token3">(</span><span class="token2">'2'</span><span class="token3">)</span><span class="token3">;</span> $list<span class="token1">-</span><span class="token1">></span><span class="token4">unshift</span><span class="token3">(</span><span class="token2">'3'</span><span class="token3">)</span><span class="token3">;</span> <span class="token">//$this->dllist=[3,2,1,a,b,c]</span> <span class="token">//移除双链表的头部的一个元素</span> $list<span class="token1">-</span><span class="token1">></span><span class="token4">shift</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> <span class="token">//$this->dllist=[2,1,a,b,c]</span> $list<span class="token1">-</span><span class="token1">></span><span class="token4">rewind</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span><span class="token">//rewind操作用于把节点指针指向Bottom所在的节点 将指针指向迭代开始处</span> echo <span class="token2">'curren node:'</span><span class="token3">.</span>$list<span class="token1">-</span><span class="token1">></span><span class="token4">current</span><span class="token3">(</span><span class="token3">)</span><span class="token3">.</span><span class="token2">"<br />"</span><span class="token3">;</span><span class="token">//获取当前节点 2</span> $list<span class="token1">-</span><span class="token1">></span><span class="token4">next</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span><span class="token">//指针指向下一个节点</span> $list<span class="token1">-</span><span class="token1">></span><span class="token4">next</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span><span class="token">//指针指向下一个节点</span> $list<span class="token1">-</span><span class="token1">></span><span class="token4">next</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span><span class="token">//指针指向下一个节点</span> $list<span class="token1">-</span><span class="token1">></span><span class="token4">next</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span><span class="token">//指针指向下一个节点</span> echo <span class="token2">'next node:'</span><span class="token3">.</span>$list<span class="token1">-</span><span class="token1">></span><span class="token4">current</span><span class="token3">(</span><span class="token3">)</span><span class="token3">.</span><span class="token2">"<br />"</span><span class="token3">;</span><span class="token">//c</span> $list<span class="token1">-</span><span class="token1">></span><span class="token4">prev</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span><span class="token">//指针指向上一个节点</span> echo <span class="token2">'next node:'</span><span class="token3">.</span>$list<span class="token1">-</span><span class="token1">></span><span class="token4">current</span><span class="token3">(</span><span class="token3">)</span><span class="token3">.</span><span class="token2">"<br />"</span><span class="token3">;</span><span class="token">//b</span> <span class="token5">if</span><span class="token3">(</span>$list<span class="token1">-</span><span class="token1">></span><span class="token4">current</span><span class="token3">(</span><span class="token3">)</span><span class="token3">)</span> echo <span class="token2">'current node is valid<br />'</span><span class="token3">;</span> <span class="token5">else</span> echo <span class="token2">'current node is invalid<br />'</span><span class="token3">;</span> <span class="token5">if</span><span class="token3">(</span>$list<span class="token1">-</span><span class="token1">></span><span class="token4">valid</span><span class="token3">(</span><span class="token3">)</span><span class="token3">)</span><span class="token">//如果当前节点是有效节点,valid返回true</span> echo <span class="token2">"valid list<br />"</span><span class="token3">;</span> <span class="token5">else</span> echo <span class="token2">"invalid list <br />"</span><span class="token3">;</span> <span class="token4">var_dump</span><span class="token3">(</span><span class="token4">array</span><span class="token3">(</span> <span class="token2">'pop'</span> <span class="token1">=</span><span class="token1">></span> $list<span class="token1">-</span><span class="token1">></span><span class="token4">pop</span><span class="token3">(</span><span class="token3">)</span><span class="token3">,</span> <span class="token2">'count'</span> <span class="token1">=</span><span class="token1">></span> $list<span class="token1">-</span><span class="token1">></span><span class="token4">count</span><span class="token3">(</span><span class="token3">)</span><span class="token3">,</span> <span class="token2">'isEmpty'</span> <span class="token1">=</span><span class="token1">></span> $list<span class="token1">-</span><span class="token1">></span><span class="token4">isEmpty</span><span class="token3">(</span><span class="token3">)</span><span class="token3">,</span> <span class="token2">'bottom'</span> <span class="token1">=</span><span class="token1">></span> $list<span class="token1">-</span><span class="token1">></span><span class="token4">bottom</span><span class="token3">(</span><span class="token3">)</span><span class="token3">,</span> <span class="token2">'top'</span> <span class="token1">=</span><span class="token1">></span> $list<span class="token1">-</span><span class="token1">></span><span class="token4">top</span><span class="token3">(</span><span class="token3">)</span> <span class="token3">)</span><span class="token3">)</span> <span class="token">//['pop'=>'c','count'=>4,'isEmpty'=>false,'bottom'=>2,top=>'b']</span> <span class="token">//设置迭代模式</span> $list<span class="token1">-</span><span class="token1">></span><span class="token4">setIteratorMode</span><span class="token3">(</span>SplDoublyLinkedList<span class="token3">:</span><span class="token3">:</span>IT_MODE_FIFO<span class="token3">)</span><span class="token3">;</span> <span class="token4">var_dump</span><span class="token3">(</span>$list<span class="token1">-</span><span class="token1">></span><span class="token4">getIteratorMode</span><span class="token3">(</span><span class="token3">)</span><span class="token3">)</span><span class="token3">;</span><span class="token">//0</span> <span class="token5">for</span><span class="token3">(</span>$list<span class="token1">-</span><span class="token1">></span><span class="token4">rewind</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> $list<span class="token1">-</span><span class="token1">></span><span class="token4">valid</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> $list<span class="token1">-</span><span class="token1">></span><span class="token4">next</span><span class="token3">(</span><span class="token3">)</span><span class="token3">)</span><span class="token3">{</span> echo $list<span class="token1">-</span><span class="token1">></span><span class="token4">current</span><span class="token3">(</span><span class="token3">)</span><span class="token3">.</span>PHP_EOL<span class="token3">;</span> <span class="token3">}</span> <span class="token4">var_dump</span><span class="token3">(</span>$a <span class="token1">=</span> $list<span class="token1">-</span><span class="token1">></span><span class="token4">serialize</span><span class="token3">(</span><span class="token3">)</span><span class="token3">)</span><span class="token3">;</span><span class="token">//"i:0;:s:1:"2";:s:1:"1";:s:1:"a";:s:1:"b";"</span> <span class="token4">print_r</span><span class="token3">(</span>$list<span class="token1">-</span><span class="token1">></span><span class="token4">unserialize</span><span class="token3">(</span>$a<span class="token3">)</span><span class="token3">)</span><span class="token3">;</span><span class="token">//null? 得到的是不想要的结果还会将$list的结果复制一遍</span> <span class="token">//用serialize($list)和unserialize($a) 代替</span> <span class="token">//offsetExists用法</span> $t <span class="token1">=</span> <span class="token4">isset</span><span class="token3">(</span>$list<span class="token3">[</span><span class="token6">0</span><span class="token3">]</span><span class="token3">)</span><span class="token3">;</span> <span class="token4">var_dump</span><span class="token3">(</span>$t<span class="token3">)</span><span class="token3">;</span><span class="token">// 输出: boolean true</span> $t <span class="token1">=</span> <span class="token4">isset</span><span class="token3">(</span>$list<span class="token3">[</span><span class="token6">10</span><span class="token3">]</span><span class="token3">)</span><span class="token3">;</span> <span class="token4">var_dump</span><span class="token3">(</span>$t<span class="token3">)</span><span class="token3">;</span><span class="token">// 输出: boolean false</span> <span class="token">//offsetGet用法</span> <span class="token4">var_dump</span><span class="token3">(</span>$list<span class="token3">[</span><span class="token6">0</span><span class="token3">]</span><span class="token3">)</span><span class="token3">;</span><span class="token">//2</span> <span class="token">//offsetSet用法</span> $list<span class="token3">[</span><span class="token6">0</span><span class="token3">]</span><span class="token1">=</span><span class="token2">'new value'</span><span class="token3">;</span> <span class="token">//offsetUnset用法</span> <span class="token4">unset</span><span class="token3">(</span>$list<span class="token3">[</span><span class="token6">0</span><span class="token3">]</span><span class="token3">)</span><span class="token3">;</span> $list<span class="token1">-</span><span class="token1">></span><span class="token4">offsetSet</span><span class="token3">(</span><span class="token6">0</span><span class="token3">,</span><span class="token2">'new one'</span><span class="token3">)</span><span class="token3">;</span> $list<span class="token1">-</span><span class="token1">></span><span class="token4">offsetUnset</span><span class="token3">(</span><span class="token6">0</span><span class="token3">)</span><span class="token3">;</span> <span class="token4">var_dump</span><span class="token3">(</span><span class="token4">array</span><span class="token3">(</span> <span class="token2">'offsetExists'</span> <span class="token1">=</span><span class="token1">></span> $list<span class="token1">-</span><span class="token1">></span><span class="token4">offsetExists</span><span class="token3">(</span><span class="token6">4</span><span class="token3">)</span><span class="token3">,</span> <span class="token2">'offsetGet'</span> <span class="token1">=</span><span class="token1">></span> $list<span class="token1">-</span><span class="token1">></span><span class="token4">offsetGet</span><span class="token3">(</span><span class="token6">0</span><span class="token3">)</span><span class="token3">,</span> <span class="token3">)</span><span class="token3">)</span><span class="token3">;</span> <span class="token">//['offsetExists'=>true,'offsetGet'=>1]</span> <span class="token4">var_dump</span><span class="token3">(</span>$list<span class="token3">)</span><span class="token3">;</span> ``` ```