博客列表 >PHP SPL标准库

PHP SPL标准库

未来
未来原创
2020年06月12日 11:59:421219浏览

PHP SPL标准库

用了这么久的php却对php的数据结构不了解哎!真的很差劲!!

SplStack(栈)

先进后出 后进先出

下面展示一些 php操作栈的函数(用法)

  1. $stack = new SplStack();
  2. //入栈
  3. $stack->push('a');
  4. $stack->push('b');
  5. //设置迭代模式
  6. $stack->setIteratorMode(SplDoublyLinkedList::IT_MODE_LIFO | SplDoublyLinkedList::IT_MODE_DELETE);
  7. //设置一个偏移位置的值
  8. $stack->offsetSet(0, 'first');//第一个参数 为0 表示的是最后一个元素
  9. //出栈
  10. //echo $stack->pop().PHP_EOL;
  11. //echo $stack->pop().PHP_EOL;
  12. //输出结果
  13. //first
  14. //a
  15. print_r($stack); //测试IteratorMode
  16. //输出结果(未时出栈 打印的数据)
  17. /*SplStack Object
  18. (
  19. [flags:SplDoublyLinkedList:private] => 7
  20. [dllist:SplDoublyLinkedList:private] => Array
  21. (
  22. [0] => a
  23. [1] => first
  24. )
  25. )*/
  26. //其他函数用法
  27. $stack->top();//双链表的头部节点
  28. $stack->bottom();//双链表的尾部节点
  29. $stack->count();//双联表元素的个数
  30. $stack->isEmpty();//检测双链表是否为空
  31. $stack->key();//当前节点索引
  32. $stack->prev();//移到上条记录
  33. $stack->next();//移到下条记录
  34. $stack->current();//当前记录
  35. $stack->rewind();//将指针指向迭代开始处
  36. $stack->valid();//检查双链表是否还有节点
  37. $stack->offsetExists(0);//指定index处节点是否存在
  38. $stack->offsetGet(0);//获取指定index处节点值
  39. $stack->offsetSet(0,'first');//设置指定index处值(同上实例)
  40. $stack->offsetUnset(0);//删除指定index处节点
  41. $stack->pop();//从双链表的尾部弹出元素
  42. $stack->push('a');//添加元素到双链表的尾部
  43. $stack->serialize();//序列化存储
  44. $stack->unserialize($stack->serialize());//反序列化
  45. /**
  46. * 可见栈和双链表的区别就是IteratorMode改变了而已,栈的IteratorMode只能为:
  47. * (1)SplDoublyLinkedList::IT_MODE_LIFO | SplDoublyLinkedList::IT_MODE_KEEP (默认值,迭代后数据保存)
  48. * (2)SplDoublyLinkedList::IT_MODE_LIFO | SplDoublyLinkedList::IT_MODE_DELETE (迭代后数据删除)
  49. */
  50. $stack->setIteratorMode(SplDoublyLinkedList::IT_MODE_LIFO | SplDoublyLinkedList::IT_MODE_DELETE);//设置迭代模式
  51. $stack->getIteratorMode();//获取迭代模式SplDoublyLinkedList::IT_MODE_LIFO (Stack style) SplDoublyLinkedList::IT_MODE_FIFO (Queue style)
  52. $stack->shift();//双链表的头部移除元素
  53. $stack->unshift('a');//双链表的头部添加元素

SplQueue(队列)

先进先出 后进后出

下面展示一些 php操作队列的函数(用法)

  1. $queue = new SplQueue();
  2. /**
  3. * 可见队列和双链表的区别就是IteratorMode改变了而已,栈的IteratorMode只能为:
  4. * (1)SplDoublyLinkedList::IT_MODE_FIFO | SplDoublyLinkedList::IT_MODE_KEEP (默认值,迭代后数据保存)
  5. * (2)SplDoublyLinkedList::IT_MODE_FIFO | SplDoublyLinkedList::IT_MODE_DELETE (迭代后数据删除)
  6. */
  7. $queue->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO | SplDoublyLinkedList::IT_MODE_DELETE);
  8. //SplQueue::enqueue()其实就是 SplDoublyLinkedList::push()
  9. $queue->enqueue('a');//同$queue->push();
  10. $queue->enqueue('b');
  11. $queue->enqueue('c');
  12. //出列队 方法1
  13. //foreach($queue as $item) {
  14. // echo $item.PHP_EOL;
  15. //}
  16. //出列队 方法2
  17. //SplQueue::dequeue()其实就是 SplDoublyLinkedList::shift()
  18. //同 $queue->shift();
  19. for($i=0;$i<$queue->count();$i++){
  20. echo $queue->dequeue() . PHP_EOL;//$queue->dequeue();//出队 默认模式是先进先出 可以通过方法setIteratorMode设置
  21. }
  22. $queue->add(1,'d');//在指定的索引处添加/插入新值
  23. $queue->count();//队列数量
  24. $queue->bottom();//从队列的第一个开始读取 默认模式是先进先出 读取是的是 “a”
  25. $queue->top();//从队列的最后一个开始读取 默认模式是先进先出 读取是的是 “c”
  26. $queue->isEmpty();//检查双向链接列表是否为空
  27. $queue->current();//获取当前的双链列表节点。
  28. $queue->key();//该函数返回当前节点索引
  29. $queue->prev();//将迭代器移至上一个节点。
  30. $queue->next();//将迭代器移至下一个节点。
  31. $queue->offsetExists(0);//获取指定index处节点值
  32. $queue->offsetSet(0,'aa');//设置指定index处值(同上实例)
  33. $queue->offsetGet(0);//获取指定index处节点值
  34. $queue->offsetUnset(0);//删除指定index处节点
  35. $queue->pop();//从双链表的尾部弹出元素
  36. 其他方法可以到PHP 官方文档上查看

SplHeap(堆)

SplHeap 是一个抽象类,实现了Iterator , Countable接口。最大堆(SplMaxHeap)和最小堆(SplMinHeap)就是继承它实现
下面展示一些 php操作队列的函数(用法)
下面这个是参考 PHP SplHeap 堆介绍.

  1. abstract SplHeap implements Iterator , Countable {
  2. // 创建一个空堆
  3. public __construct ( void )
  4. // 比较节点大小
  5. abstract protected int compare ( mixed $value1 , mixed $value2 )
  6. // 返回堆数量
  7. public int count ( void )
  8. // 返回迭代指针指向的节点
  9. public mixed current ( void )
  10. // 从堆顶部提取一个节点并重建堆
  11. public mixed extract ( void )
  12. // 向堆中添加一个节点并重建堆
  13. public void insert ( mixed $value )
  14. // 判断是否为空堆
  15. public bool isEmpty ( void )
  16. // 返回迭代指针指向的节点的键
  17. public mixed key ( void )
  18. // 将迭代器移至上一个节点
  19. public void next ( void )
  20. // 恢复堆
  21. public void recoverFromCorruption ( void )
  22. // 重置迭代指针
  23. public void rewind ( void )
  24. // 和队列相同 返回顶部节点
  25. public mixed top ( void )
  26. // 判断迭代指针指向的节点是否存在
  27. public bool valid ( void )
  28. }
  29. class iMaxHeap extends SplHeap
  30. {
  31. /**
  32. * 实现compare抽象方法,使用关联数组的值进行比较排序
  33. * SplMaxHeap不能满足我们的需求
  34. */
  35. public function compare($array1, $array2)
  36. {
  37. $values1 = array_values($array1);
  38. $values2 = array_values($array2);
  39. if($values1[0] === $values2[0]) return 0;
  40. return $values1[0] < $values2[0] ? -1 : 1;
  41. }
  42. }
  43. $heap = new iMaxHeap();

PHP 数据结构

: SplDoublyLinkedList — The SplDoublyLinkedList class
: SplStack — The SplStack class
: SplQueue — The SplQueue class
: SplHeap — TheSplHeap class
: SplMaxHeap — The SplMaxHeap class
: SplMinHeap — The SplMinHeap class
: SplPriorityQueue — The SplPriorityQueue class
: SplFixedArray — The SplFixedArray class
: SplObjectStorage — The SplObjectStorage class

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议