PHP SPL(PHP 标准库)
来源:互联网 发布:美工海报设计兼职 编辑:程序博客网 时间:2024/06/07 09:58
一.什么是SPL?
SPL是用于解决典型问题(standard problems)的一组接口与类的集合。(出自:http://php.net/manual/zh/intro.spl.php)
SPL,PHP 标准库(Standard PHP Library) ,从 PHP 5.0 起内置的组件和接口,且从 PHP5.3 已逐渐的成熟。SPL 在所有的 PHP5 开发环境中被内置,同时无需任何设置。
二.如何使用?
SPL提供了一组标准数据结构:
双向链表
- SplDoublyLinkedList
- SplStack
- SplQueue
双链表是一种重要的线性存储结构,对于双链表中的每个节点,不仅仅存储自己的信息,还要保存前驱和后继节点的地址。
PHP SPL中的SplDoublyLinkedList类提供了对双链表的操作。
SplDoublyLinkedList类摘要如下:
1 SplDoublyLinkedList implements Iterator , ArrayAccess , Countable { 2 3 public __construct ( void ) 4 public void add ( mixed $index , mixed $newval ) 5 //双链表的头部节点 6 public mixed top ( void ) 7 //双链表的尾部节点 8 public mixed bottom ( void ) 9 //双联表元素的个数10 public int count ( void )11 //检测双链表是否为空12 public bool isEmpty ( void )13 14 15 //当前节点索引16 public mixed key ( void )17 //移到上条记录18 public void prev ( void )19 //移到下条记录20 public void next ( void )21 //当前记录22 public mixed current ( void )23 //将指针指向迭代开始处24 public void rewind ( void )25 //检查双链表是否还有节点26 public bool valid ( void )27 28 //指定index处节点是否存在29 public bool offsetExists ( mixed $index )30 //获取指定index处节点值31 public mixed offsetGet ( mixed $index )32 //设置指定index处值33 public void offsetSet ( mixed $index , mixed $newval )34 //删除指定index处节点35 public void offsetUnset ( mixed $index )36 37 //从双链表的尾部弹出元素38 public mixed pop ( void )39 //添加元素到双链表的尾部40 public void push ( mixed $value )41 42 //序列化存储43 public string serialize ( void )44 //反序列化45 public void unserialize ( string $serialized )46 47 //设置迭代模式48 public void setIteratorMode ( int $mode )49 //获取迭代模式SplDoublyLinkedList::IT_MODE_LIFO (Stack style) SplDoublyLinkedList::IT_MODE_FIFO (Queue style)50 public int getIteratorMode ( void )51 52 //双链表的头部移除元素53 public mixed shift ( void )54 //双链表的头部添加元素55 public void unshift ( mixed $value )56 57 }
使用起来也比较简单
1 $list = new SplDoublyLinkedList(); 2 $list->push('a'); 3 $list->push('b'); 4 $list->push('c'); 5 $list->push('d'); 6 7 $list->unshift('top'); 8 $list->shift(); 9 10 $list->rewind();//rewind操作用于把节点指针指向Bottom所在的节点11 echo 'curren node:'.$list->current()."<br />";//获取当前节点12 13 $list->next();//指针指向下一个节点14 echo 'next node:'.$list->current()."<br />";15 16 $list->next();17 $list->next();18 $list->prev();//指针指向上一个节点19 echo 'next node:'.$list->current()."<br />";20 21 if($list->current())22 echo 'current node is valid<br />';23 else24 echo 'current node is invalid<br />';25 26 27 if($list->valid())//如果当前节点是有效节点,valid返回true28 echo "valid list<br />";29 else30 echo "invalid list <br />";31 32 33 var_dump(array(34 'pop' => $list->pop(),35 'count' => $list->count(),36 'isEmpty' => $list->isEmpty(),37 'bottom' => $list->bottom(),38 'top' => $list->top()39 ));40 41 $list->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO);42 var_dump($list->getIteratorMode());43 44 for($list->rewind(); $list->valid(); $list->next()) {45 echo $list->current().PHP_EOL;46 }47 48 var_dump($a = $list->serialize());49 //print_r($list->unserialize($a));50 51 $list->offsetSet(0,'new one');52 $list->offsetUnset(0);53 var_dump(array(54 'offsetExists' => $list->offsetExists(4),55 'offsetGet' => $list->offsetGet(0),56 57 ));58 var_dump($list);59 60 //堆栈,先进后出61 $stack = new SplStack();//继承自SplDoublyLinkedList类62 63 $stack->push("a<br />");64 $stack->push("b<br />");65 66 echo $stack->pop();67 echo $stack->pop();68 echo $stack->offsetSet(0,'B');//堆栈的offset=0是Top所在的位置,offset=1是Top位置节点靠近bottom位置的相邻节点,以此类推69 $stack->rewind();//双向链表的rewind和堆栈的rewind相反,堆栈的rewind使得当前指针指向Top所在的位置,而双向链表调用之后指向bottom所在位置70 echo 'current:'.$stack->current().'<br />';71 72 $stack->next();//堆栈的next操作使指针指向靠近bottom位置的下一个节点,而双向链表是靠近top的下一个节点73 echo 'current:'.$stack->current().'<br />';74 echo '<br /><br />';75 76 //队列,先进先出77 $queue = new SplQueue();//继承自SplDoublyLinkedList类78 79 $queue->enqueue("a<br />");//插入一个节点到队列里面的Top位置80 $queue->enqueue("b<br />");81 82 $queue->offsetSet(0,'A');//堆栈的offset=0是Top所在的位置,offset=1是Top位置节点靠近bottom位置的相邻节点,以此类推83 84 echo $queue->dequeue();85 echo $queue->dequeue();86 87 echo "<br /><br />";
堆
- SplHeap
- SplMaxHeap
- SplMinHeap
堆(Heap)就是为了实现优先队列而设计的一种数据结构,它是通过构造二叉堆(二叉树的一种)实现。根节点最大的堆叫做最大堆或大根堆(SplMaxHeap),根节点最小的堆叫做最小堆或小根堆(SplMinHeap)。二叉堆还常用于排序(堆排序)。
SplHeap类摘要如下:
1 abstract SplHeap implements Iterator , Countable { 2 /* 方法 */ 3 public __construct ( void ) 4 abstract protected int compare ( mixed $value1 , mixed $value2 ) 5 public int count ( void ) 6 public mixed current ( void ) 7 public mixed extract ( void ) 8 public void insert ( mixed $value ) 9 public bool isEmpty ( void )10 public mixed key ( void )11 public void next ( void )12 public void recoverFromCorruption ( void )13 public void rewind ( void )14 public mixed top ( void )15 public bool valid ( void )16 }
显然它是一个抽象类,最大堆(SplMaxHeap)和最小堆(SplMinHeap)就是继承它实现的。最大堆和最小堆并没有额外的方法。
SplHeap简单使用:
1 //堆 2 class MySplHeap extends SplHeap{ 3 //compare()方法用来比较两个元素的大小,绝对他们在堆中的位置 4 public function compare( $value1, $value2 ) { 5 return ( $value1 - $value2 ); 6 } 7 } 8 9 $obj = new MySplHeap();10 11 $obj->insert(0);12 $obj->insert(1);13 $obj->insert(2);14 $obj->insert(3);15 $obj->insert(4);16 17 echo $obj->top();//418 echo $obj->count();//519 20 foreach ($obj as $item) {21 echo $item."<br />";22 }
队列
- SplPriorityQueue
优先队列也是非常实用的一种数据结构,可以通过加权对值进行排序,由于排序在php内部实现,业务代码中将精简不少而且更高效。通过SplPriorityQueue::setExtractFlags(int $flag)设置提取方式可以提取数据(等同最大堆)、优先级、和两者都提取的方式。
SplPriorityQueue类摘要如下:
1 SplPriorityQueue implements Iterator , Countable { 2 /* 方法 */ 3 public __construct ( void ) 4 public int compare ( mixed $priority1 , mixed $priority2 ) 5 public int count ( void ) 6 public mixed current ( void ) 7 public mixed extract ( void ) 8 public void insert ( mixed $value , mixed $priority ) 9 public bool isEmpty ( void )10 public mixed key ( void )11 public void next ( void )12 public void recoverFromCorruption ( void )13 public void rewind ( void )14 public void setExtractFlags ( int $flags )15 public mixed top ( void )16 public bool valid ( void )17 }
简单使用:
1 $pq = new SplPriorityQueue(); 2 3 $pq->insert('a', 10); 4 $pq->insert('b', 1); 5 $pq->insert('c', 8); 6 7 echo $pq->count() .PHP_EOL; //3 8 echo $pq->current() . PHP_EOL; //a 9 10 /**11 * 设置元素出队模式12 * SplPriorityQueue::EXTR_DATA 仅提取值13 * SplPriorityQueue::EXTR_PRIORITY 仅提取优先级14 * SplPriorityQueue::EXTR_BOTH 提取数组包含值和优先级15 */16 $pq->setExtractFlags(SplPriorityQueue::EXTR_DATA);17 18 while($pq->valid()) {19 print_r($pq->current()); //a c b20 $pq->next();21 }
阵列
- SplFixedArray
SplFixedArray主要是处理数组相关的主要功能,与普通php array不同的是,它是固定长度的,且以数字为键名的数组,优势就是比普通的数组处理更快。通常情况下SplFixedArray要比php array快上20%~30%,所以如果你是处理巨大数量的固定长度数组,还是强烈建议使用。
SplFixedArray类摘要如下:
1 SplFixedArray implements Iterator , ArrayAccess , Countable { 2 /* 方法 */ 3 public __construct ([ int $size = 0 ] ) 4 public int count ( void ) 5 public mixed current ( void ) 6 public static SplFixedArray fromArray ( array $array [, bool $save_indexes = true ] ) 7 public int getSize ( void ) 8 public int key ( void ) 9 public void next ( void )10 public bool offsetExists ( int $index )11 public mixed offsetGet ( int $index )12 public void offsetSet ( int $index , mixed $newval )13 public void offsetUnset ( int $index )14 public void rewind ( void )15 public int setSize ( int $size )16 public array toArray ( void )17 public bool valid ( void )18 public void __wakeup ( void )19 }
简单使用:
1 $arr = new SplFixedArray(4); 2 $arr[0] = 'php'; 3 $arr[1] = 1; 4 $arr[3] = 'python'; 5 6 //遍历, $arr[2] 为null 7 foreach($arr as $v) { 8 echo $v . PHP_EOL; 9 }10 11 //获取数组长度12 echo $arr->getSize(); //413 14 //增加数组长度15 $arr->setSize(5);16 $arr[4] = 'new one';17 18 //捕获异常19 try{20 echo $arr[10];21 } catch (RuntimeException $e) {22 echo $e->getMessage();23 }
映射
- SplObjectStorage
用来存储一组对象的,特别是当你需要唯一标识对象的时候。
PHP SPL SplObjectStorage类实现了Countable,Iterator,Serializable,ArrayAccess四个接口。可实现统计、迭代、序列化、数组式访问等功能。
SplObjectStorage类摘要如下:
1 SplObjectStorage implements Countable , Iterator , Serializable , ArrayAccess { 2 /* 方法 */ 3 public void addAll ( SplObjectStorage $storage ) 4 public void attach ( object $object [, mixed $data = NULL ] ) 5 public bool contains ( object $object ) 6 public int count ( void ) 7 public object current ( void ) 8 public void detach ( object $object ) 9 public string getHash ( object $object )10 public mixed getInfo ( void )11 public int key ( void )12 public void next ( void )13 public bool offsetExists ( object $object )14 public mixed offsetGet ( object $object )15 public void offsetSet ( object $object [, mixed $data = NULL ] )16 public void offsetUnset ( object $object )17 public void removeAll ( SplObjectStorage $storage )18 public void removeAllExcept ( SplObjectStorage $storage )19 public void rewind ( void )20 public string serialize ( void )21 public void setInfo ( mixed $data )22 public void unserialize ( string $serialized )23 public bool valid ( void )24 }
简单使用:
1 class A { 2 public $i; 3 public function __construct($i) { 4 $this->i = $i; 5 } 6 } 7 8 $a1 = new A(1); 9 $a2 = new A(2);10 $a3 = new A(3);11 $a4 = new A(4);12 13 $container = new SplObjectStorage();14 15 //SplObjectStorage::attach 添加对象到Storage中16 $container->attach($a1);17 $container->attach($a2);18 $container->attach($a3);19 20 //SplObjectStorage::detach 将对象从Storage中移除21 $container->detach($a2);22 23 //SplObjectStorage::contains用于检查对象是否存在Storage中24 var_dump($container->contains($a1)); //true25 var_dump($container->contains($a4)); //false26 27 //遍历28 $container->rewind();29 while($container->valid()) {30 var_dump($container->current());31 $container->next();32 }
- PHP SPL 标准库
- php标准库SPL
- PHP spl 标准库
- PHP SPL标准库
- PHP SPL标准库
- PHP SPL(PHP 标准库)
- PHP SPL(PHP 标准库)
- PHP SPL(PHP 标准库)
- php标准库(SPL)-SPL函数
- 标准php库SPL学习(一)简介
- PHP SPL标准库之SplFixedArray简介
- PHP SPL标准库之SplStack简介
- SPL(PHP标准库之数据结构)
- php标准库函数功能(SPL)
- php spl库的使用(PHP标准库)【摘抄引用】
- SPL是Standard PHP Library(PHP标准库)的缩写。
- PHP SPL标准库的用法(遍历目录)
- 使用php标准库spl在实现观察者模式
- ERP小结-应用
- Plus One
- (项目)AR电子书系统创新实训第五周(1)
- Python基础(二)
- FileUtil
- PHP SPL(PHP 标准库)
- jetty学习--初识jetty
- AndroidStudio 插件 之 Findbugs 安装与简单使用教程
- [JZOJ5137][SDOI省队集训2017][bzoj4842]养猫
- it oracle 入门级 体系介绍
- FUNDAMENTAL Unit04 循环结构(while、do-while、for)
- android热插件,热更新,热修复,模块化
- iscsi
- 行列式求值