深入浅出 PHP SPL(PHP 标准库)(转)
2024-08-29 06:26:13
一、什么是spl库?
SPL是用于解决典型问题(standard problems)的一组接口与类的集合。
此扩展只能在php 5.0以后使用,从PHP 5.3.0 不再被关闭,会一直有效.成为php内核组件一部份。
SPL提供了一组标准数据结构。
二、SPL如何使用?
1.构建此扩展不需要其他扩展。
更详细的情况可参考 http://php.net/manual/zh/spl.datastructures.php
双向链表
双链表是一种重要的线性存储结构,对于双链表中的每个节点,不仅仅存储自己的信息,还要保存前驱和后继节点的地址。
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)。二叉堆还常用于排序(堆排序)
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();//
echo $obj->count();// foreach ($obj as $item) {
echo $item."<br />";
}
阵列
优先队列也是非常实用的一种数据结构,可以通过加权对值进行排序,由于排序在php内部实现,业务代码中将精简不少而且更高效。通过SplPriorityQueue::setExtractFlags(int $flag)设置提取方式可以提取数据(等同最大堆)、优先级、和两者都提取的方式。
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 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
最新文章
- SharePoint 2013 Nintex Workflow 工作流帮助(十)
- Comments
- TRIGGERS_监测系统_原始数据表触发器—调用告警信息存储过程
- shell全备份脚本(借鉴别人的,在其基础上修复完善了bug)
- J - 搞笑版费马大定理
- Windows Azure入门教学系列 (三):创建第一个Worker Role程序
- 硬盘被误格式化或Ghost还原后的数据恢复
- NSPredicate的用法
- Git合并分支出现的冲突解决
- CSS制作波浪线
- 如何给自己的app添加分享到有道云笔记这样的功能
- arcgis api 4.x for js之基础地图篇
- 自动化部署iptables防火墙脚本
- epoll_wait会被系统中断唤醒
- BZOJ1178 APIO2009 会议中心 贪心、倍增
- NOIP2002-2017提高组题解
- Redis+Keepalived高可用环境部署记录
- Ext.require 的作用(转)
- linux内核分析--操作系统是如何工作的?
- logstash日志分析的配置和使用(转)
热门文章
- .Net core-邮件发送(同步,异步)底层代码(欢迎留言讨论)
- [TimLinux] Python 修改进程显示出的标题
- webpack4.0(三)--动态生成html
- 2017 CCPC秦皇岛 A题 A Ballon Robot
- CodeForces 607B zuma
- 1、在aspx.cs后台Response.Write()跳转路径,打开新窗口
- Python 入门必学经典知识点笔记【肯定有你不知道的】
- 剑指Offer-41.和为S的连续正数序列(C++/Java)
- android studio 刚安装需要配置的东西
- VMware Fushion解决:与vmmon模块的版本不匹配: 需要385.0,现有330.0。