一、什么是spl庫?
SPL是用于解決典型問題(standard problems)的一組介面與類的集合,
此擴展只能在php 5.0以后使用,從PHP 5.3.0 不再被關閉,會一直有效.成為php內核組件一部份,
SPL提供了一組標準資料結構,
二、SPL如何使用?
1.構建此擴展不需要其他擴展,
更詳細的情況可參考 http://php.net/manual/zh/spl.datastructures.php
雙向鏈表
雙鏈表是一種重要的線性存盤結構,對于雙鏈表中的每個節點,不僅僅存盤自己的資訊,還要保存前驅和后繼節點的地址,
SplDoublyLinkedList
-
SplStack(堆疊)
-
SplQueue(佇列)
SplDoublyLinkedList implements Iterator , ArrayAccess , Countable { /* 方法 */ public __construct ( void ) public void add ( mixed $index , mixed $newval ) public mixed bottom ( void )//雙鏈表的尾部節點 public int count ( void )//雙聯表元素的個數 public mixed current ( void )//當前記錄 public int getIteratorMode ( void ) //獲取迭代模式 public bool isEmpty ( void )//檢測雙鏈表是否為空 public mixed key ( void )//當前節點索引 public void next ( void )//移到下條記錄 public bool offsetExists ( mixed $index )//指定index處節點是否存在 public mixed offsetGet ( mixed $index )//獲取指定index處節點值 public void offsetSet ( mixed $index , mixed $newval )//設定指定index處值 public void offsetUnset ( mixed $index )//洗掉指定index處節點 public mixed pop ( void )//從雙鏈表的尾部彈出元素 public void prev ( void )//移到上條記錄 public void push ( mixed $value )//添加元素到雙鏈表的尾部 public void rewind ( void )//將指標指向迭代開始處 public string serialize ( void )//序列化存盤 public void setIteratorMode ( int $mode )//設定迭代模式 public mixed shift ( void )//雙鏈表的頭部移除元素 public mixed top ( void )//雙鏈表的頭部節點 public void unserialize ( string $serialized )//反序列化 public void unshift ( mixed $value )//雙鏈表的頭部添加元素 public bool valid ( void )//檢查雙鏈表是否還有節點 }
接下來是使用方法:
$list = new SplDoublyLinkedList();
$list->push('a');
$list->push('b'); $list->push('c'); $list->push('d'); $list->unshift('top'); $list->shift(); $list->rewind();//rewind操作用于把節點指標指向Bottom所在的節點 echo 'curren node:'.$list->current()."<br />";//獲取當前節點 $list->next();//指標指向下一個節點 echo 'next node:'.$list->current()."<br />"; $list->next(); $list->next(); $list->prev();//指標指向上一個節點 echo 'next node:'.$list->current()."<br />"; if($list->current()) echo 'current node is valid<br />'; else echo 'current node is invalid<br />'; if($list->valid())//如果當前節點是有效節點,valid回傳true echo "valid list<br />"; else echo "invalid list <br />"; var_dump(array( 'pop' => $list->pop(), 'count' => $list->count(), 'isEmpty' => $list->isEmpty(), 'bottom' => $list->bottom(), 'top' => $list->top() )); $list->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO); var_dump($list->getIteratorMode()); for($list->rewind(); $list->valid(); $list->next()){ echo $list->current().PHP_EOL; } var_dump($a = $list->serialize()); //print_r($list->unserialize($a)); $list->offsetSet(0,'new one'); $list->offsetUnset(0); var_dump(array( 'offsetExists' => $list->offsetExists(4), 'offsetGet' => $list->offsetGet(0), )); var_dump($list); //堆疊,先進后出 $stack = new SplStack();//繼承自SplDoublyLinkedList類 $stack->push("a<br />"); $stack->push("b<br />"); echo $stack->pop(); echo $stack->pop(); echo $stack->offsetSet(0,'B');//堆疊的offset=0是Top所在的位置,offset=1是Top位置節點靠近bottom位置的相鄰節點,以此類推 $stack->rewind();//雙向鏈表的rewind和堆疊的rewind相反,堆疊的rewind使得當前指標指向Top所在的位置,而雙向鏈表呼叫之后指向bottom所在位置 echo 'current:'.$stack->current().'<br />'; $stack->next();//堆疊的next操作使指標指向靠近bottom位置的下一個節點,而雙向鏈表是靠近top的下一個節點 echo 'current:'.$stack->current().'<br />'; echo '<br /><br />'; //佇列,先進先出 $queue = new SplQueue();//繼承自SplDoublyLinkedList類 $queue->enqueue("a<br />");//插入一個節點到佇列里面的Top位置 $queue->enqueue("b<br />"); $queue->offsetSet(0,'A');//堆疊的offset=0是Top所在的位置,offset=1是Top位置節點靠近bottom位置的相鄰節點,以此類推 echo $queue->dequeue(); echo $queue->dequeue(); echo "<br /><br />";
堆
堆(Heap)就是為了實作優先佇列而設計的一種資料結構,它是通過構造二叉堆(二叉樹的一種)實作,根節點最大的堆叫做最大堆或大根堆(SplMaxHeap),根節點最小的堆叫做最小堆或小根堆(SplMinHeap),二叉堆還常用于排序(堆排序)
-
SplHeap
-
SplMaxHeap
-
SplMinHeap
-
SplPriorityQueue
abstract SplHeap implements Iterator , Countable { /* 方法 用法同雙向鏈表一致 */ public __construct ( void ) abstract protected int compare ( mixed $value1 , mixed $value2 ) public int count ( void ) public mixed current ( void ) public mixed extract ( void ) public void insert ( mixed $value ) public bool isEmpty ( void ) public mixed key ( void ) public void next ( void ) public void recoverFromCorruption ( void ) public void rewind ( void ) public mixed top ( void ) public bool valid ( void ) }
使用方法:
//堆 class MySplHeap extends SplHeap{ //compare()方法用來比較兩個元素的大小,絕對他們在堆中的位置 public function compare( $value1, $value2 ) { return ( $value1 - $value2 ); } } $obj = new MySplHeap(); $obj->insert(0); $obj->insert(1); $obj->insert(2); $obj->insert(3); $obj->insert(4); echo $obj->top();//4 echo $obj->count();//5 foreach ($obj as $item) { echo $item."<br />"; }
陣列
優先佇列也是非常實用的一種資料結構,可以通過加權對值進行排序,由于排序在php內部實作,業務代碼中將精簡不少而且更高效,通過SplPriorityQueue::setExtractFlags(int $flag)設定提取方式可以提取資料(等同最大堆)、優先級、和兩者都提取的方式,
-
SplFixedArray
SplFixedArray implements Iterator , ArrayAccess , Countable { /* 方法 */ public __construct ([ int $size = 0 ] ) public int count ( void ) public mixed current ( void ) public static SplFixedArray fromArray ( array $array [, bool $save_indexes = true ] ) public int getSize ( void ) public int key ( void ) public void next ( void ) public bool offsetExists ( int $index ) public mixed offsetGet ( int $index ) public void offsetSet ( int $index , mixed $newval ) public void offsetUnset ( int $index ) public void rewind ( void ) public int setSize ( int $size ) public array toArray ( void ) public bool valid ( void ) public void __wakeup ( void ) }
使用方法:
$arr = new SplFixedArray(4); $arr[0] = 'php'; $arr[1] = 1; $arr[3] = 'python';//遍歷, $arr[2] 為null foreach($arr as $v) { echo $v . PHP_EOL; } //獲取陣列長度 echo $arr->getSize(); //4 //增加陣列長度 $arr->setSize(5); $arr[4] = 'new one'; //捕獲例外 try{ echo $arr[10]; } catch (RuntimeException $e) { echo $e->getMessage(); }
映射
用來存盤一組物件的,特別是當你需要唯一標識物件的時候,
-
SplObjectStorage
SplObjectStorage implements Countable , Iterator , Serializable , ArrayAccess { /* 方法 */ public void addAll ( SplObjectStorage $storage ) public void attach ( object $object [, mixed $data = NULL ] ) public bool contains ( object $object ) public int count ( void ) public object current ( void ) public void detach ( object $object ) public string getHash ( object $object ) public mixed getInfo ( void ) public int key ( void ) public void next ( void ) public bool offsetExists ( object $object ) public mixed offsetGet ( object $object ) public void offsetSet ( object $object [, mixed $data = NULL ] ) public void offsetUnset ( object $object ) public void removeAll ( SplObjectStorage $storage ) public void removeAllExcept ( SplObjectStorage $storage ) public void rewind ( void ) public string serialize ( void ) public void setInfo ( mixed $data ) public void unserialize ( string $serialized ) public bool valid ( void ) }
使用方法:
class A { public $i; public function __construct($i) { $this->i = $i; } } $a1 = new A(1); $a2 = new A(2); $a3 = new A(3); $a4 = new A(4); $container = new SplObjectStorage(); //SplObjectStorage::attach 添加物件到Storage中 $container->attach($a1); $container->attach($a2); $container->attach($a3); //SplObjectStorage::detach 將物件從Storage中移除 $container->detach($a2); //SplObjectStorage::contains用于檢查物件是否存在Storage中 var_dump($container->contains($a1)); //true var_dump($container->contains($a4)); //false //遍歷 $container->rewind(); while($container->valid()) { var_dump($container->current()); $container->next(); }
原文地址:http://www.imooc.com/article/34286
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/98227.html
標籤:PHP
