当前位置: 首页 > 后端技术 > PHP

简单的PHP,SPL(PHP标准库)

时间:2023-03-30 02:46:01 PHP

1.什么是spl库?SPL是一组用于解决标准问题的接口和类。此扩展只能在php5.0之后使用。从PHP5.3.0起不再关闭,永远有效。它将成为php内核组件的一部分。SPL提供了一套标准的数据结构。2.如何使用SPL?双链表双链表是一种重要的线性存储结构。对于双链表中的每个节点,它不仅保存了自己的信息,还保存了前后节点的地址。SplDoublyLinkedListSplStack(stack)SplQueue(queue)SplDoublyLinkedListimplementsIterator,ArrayAccess,Countable{/*method*/public__construct(void)publicvoidadd(mixed$index,mixed$newval)publicmixedbottom(void)//尾部双链表Nodepublicintcount(void)//双链表元素个数publicmixedcurrent(void)//当前记录publicintgetIteratorMode(void)//获取迭代模式publicboolisEmpty(void)//检测双链表是否为空publicmixedkey(void)//当前节点索引publicvoidnext(void)//移动到下一条记录publicbooloffsetExists(mixed$index)//指定索引处的节点是否存在publicmixedoffsetGet(mixed$index)//获取指定索引处的节点值publicvoidoffsetSet(mixed$index,mixed$newval)//设置指定索引处的值publicvoidoffsetUnset(mixed$index)//删除指定索引处的节点publicmixedpop(void)//从双链表尾部弹出元素publicvoidprev(void)//移动到上一条记录publicvoidpush(mixed$value)//添加元素到链表尾部双链表publicvoidrewind(void)//指向迭代开始的指针publicstringserialize(void)//序列化存储publicvoidsetIteratorMode(int$mode)//设置迭代模式publicmixedshift(void)//去掉双链表头部元素publicmixedtop(void)//双链表头节点publicvoidunserialize(string$serialized)//反序列化publicvoidunshift(mixed$value)//向双链表头部添加元素publicboolvalid(void)//检查双链表中是否有结点}接下来是使用方法:$list=newSplDoublyLinkedList();$list->push('a');$list=newSplDoublyLinkedList();$list->push('a');$list->push('b');$list->push('c');$list->push('d');$list->unshift('top');$list->shift();$list->rewind();//rewind操作用于将节点指针指向Bottom所在节点echo'currentnode:'.$list->current()."
";//获取当前节点$list->next();//指针指向下一个节点echo'nextnode:'.$list->current()."
";$列表->下一个();$列表->下一个();$list->prev();//指针指向上一个节点echo'nextnode:'.$list->current()."
";if($list->current())echo'当前节点有效
';elseecho'当前节点无效
';if($list->valid())//如果当前节点是有效节点,valid返回trueecho"validlist
";elseecho"invalidlist
";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,'newone');$list->offsetUnset(0);var_dump(array('offsetExists'=>$list->offsetExists(4),'offsetGet'=>$list->offsetGet(0),));变量转储($列表);//堆栈,先进后出$stack=newSplStack();//继承自SplDoublyLinkedList类$stack->push("a
");$stack->push("b
");echo$stack->pop();echo$stack->pop();echo$stack->offsetSet(0,'B');//栈的offset=0就是Top的位置,offset=1为Top位置节点靠近底部位置的相邻节点,以此类推$stack->rewind();//双向链表的倒带与栈的倒带相反,的倒带调用echo'current:'.$stack->current().'
';$stack-后栈使当前指针指向Top的位置,双向链表指向bottom的位置>下一步();//堆栈的下一个操作使指针指向靠近底部位置的下一个节点,而双向链表是靠近顶部的下一个节点echo'current:'.$stack->current().'
';回声'

';//队列,先进先出$queue=newSplQueue();//继承自SplDoublyLinkedList类$queue->enqueue("a
");//插入一个从节点到Top位置的queue$queue->enqueue("b
");$queue->offsetSet(0,'A');//栈的offset=0为Top的位置,offset=1为相邻节点靠近底部位置的顶部位置节点,依此类推echo$queue->dequeue();echo$queue->dequeue();echo"

";)是为实现优先级队列而设计的数据结构,它通过构造一个二叉堆(两个叉树的实现。根节点最大的堆称为最大堆或大根堆(SplMaxHeap),根节点最小的堆称为最小堆或小根堆(SplMinHeap)。二叉堆也常用于排序(heapsorting)SplHeapSplMaxHeapSplMinHeapSplPriorityQueueabstractSplHeapimplementsIterator,Countable{/*方法用法与双向链表一致*/public__construct(void)abstractprotectedintcompare(mixed$value1,mixed$value2)publicintcount(void)publicmixedcurrent(void)publicmixedextract(void)publicvoidinsert(mixed$value)publicboolisEmpty(void)publicmixedkey(void)publicvoidnext(void)publicvoidrecoverFromCorruption(void)publicvoidre(void)publicmixedtop(void)publicboolvalid(void)}使用方法://heapclassMySplHeapextendsSplHeap{//compare()方法用于比较两个元素的大小并确定它们的位置在堆中publicfunctioncompare($value1,$value2){return($value1-$value2);}}$obj=newMySplHeap();$obj->insert(0);$obj->insert(1);$obj->insert(2);$obj->insert(3);$obj->insert(4);echo$obj->top();//4echo$obj->count();//5foreach($objas$item){echo$item."
";}Array优先级队列也是一个非常实用的数据结构,可以对值进行加权排序。由于排序是用PHP实现的,业务代码会简化得更少,效率更高。提取方式可以通过SplPriorityQueue::setExtractFlags(int$flag)设置提取数据(相当于最大堆),优先级,两种提取方式。SplFixedArraySplFixedArray实现Iterator,ArrayAccess,Countable{/*方法*/    public__construct([int$size=0])  publicintcount(void)  publicmixedcurrent(void)  publicstaticSplFixedArrayfromArray(array$array[,bool$save_indexes=true])  publicintgetSize(void)  publicintkey(void)publicvoidnext(void)  publicbooloffsetExists(int$index)  publicmixedoffsetGet(int$index)  publicvoidoffsetSet(int$index,mixed$newval)  publicvoidoffsetUnset(int$index)publicvoidrewind(void)  publicintsetSize(int$size)  publicarraytoArray(void)  publicboolvalid(void)  publicvoid__wakeup(void)}使用方法:$arr=newSplFixedArray(4);$arr[0]='php';$arr[1]=1;$arr[3]='python';//遍历,$arr[2]为nullforeach($arras$v){echo$v.PHP_EOL;}//获取数组长度echo$arr->getSize();//4//增加数组的长度$arr->setSize(5);$arr[4]='新的';//Catchexceptiontry{echo$arr[10];}catch(RuntimeException$e){echo$e->getMessage();}映射用于存储一组对象,特别是当你需要唯一标识对象时。SplObjectStorageSplObjectStorage实现Countable,Iterator,Serializable,ArrayAccess{  /*方法*/    publicvoidaddAll(SplObjectStorage$storage)  publicvoidattach(object$object[,mixed$data=NULL])  publicboolcontains(object$object)  publicintcount(void)  publicobjectcurrent(void)  publicvoiddetach(object$object)  publicstringgetHash(object$object)  publicmixedgetInfo(void)  publicintkey(void)  publicvoidnext(void)  publicbooloffsetExists(object$object)publicmixedoffsetGet(object$object)  publicvoidoffsetSet(object$object[,mixed$data=NULL])  publicvoidoffsetUnset(object$object)  publicvoidremoveAll(SplObjectStorage$storage)  publicvoidremoveAllExcept(SplObjectStorage$storage)  publicvoidrewind(void)  publicstringserialize(void)  publicvoidsetInfo(mixed$data)  publicvoidunserialize(string$serialized)  publicboolvalid(void)}使用方法:classA{public$i;公共函数__construct($i){$this->i=$i;}}$a1=新A(1);$a2=新A(2);$a3=新A(3);$a4=新A(4);$container=newSplObjectStorage();//SplObjectStorage::attach添加对象到存储$container->attach($a1);$container->attach($a2);$container->attach($a3);//SplObjectStorage::detach从Storage中移除对象$container->detach($a2);//SplObjectStorage::contains用于检查Storage中是否存在对象var_dump($container->contains($a1));//truevar_dump($container->contains($a4));//false//遍历$container->rewind();while($container->valid()){var_dump($container->current());$容器->下一个();}