zoukankan      html  css  js  c++  java
  • SPL 笔记

    PHP  SPL是指 standard  php library,php标准库。


    SPL提供了一系列的类和接口,使用这些类和接口,我们可以更加高效、优雅的使用php进行程序设计。
     
    从php5.0开始,已经支持spl。从5.3开始,SPL已经嵌入PHP内核,无需任何配置
     
    php提供了下列的数据结构类:
     
    SplDoublyLinkedList  :双向链表 , 实现了 Iterator|ArrayAccess|Countable接口中的方法

    SplStack: 栈

    SplQueue: 队列

    SplHeap :堆

    SplMaxHeap:大顶堆

    SplMinHeap:小顶堆

    SplPriorityQueue:带权队列

    SplFixedArray:固定数组
     
     
    先学习SplFixedArray,为之后其他的学习打下基础
    <?php
    /*
     * SplFixedArray():用于创建固定长度的数组,只允许整型数作为索引,比普通php数组更快,性能更好
     * 它本身实现了Iterator  ArrayAccess  Countable这几个接口
     * 实现了ArrayAccess,那么可以使用foreach遍历
     * 实现了Countable,那么可以使用count计算长度
     * 实现了Iterator,那么可以向链表一样操作
     */
    $arr = new SplFixedArray(5);//创建时指定长度
    
    $arr->setSize(4);//setSize()动态设置数组长度
    $arr[0] = 'a';
    $arr[1] = 'b';
    $arr[2] = 'c';
    $arr[3] = 'd';
    
    //遍历,遍历完后指针指向末尾空
    foreach ($arr as $v){
    	echo $v;
    	echo PHP_EOL;
    }
    echo "<br/>";
    var_dump($arr->valid());//已经移出数组外
    
    //getSize() count()都是获取数组长度
    $a = $arr->getSize();
    echo $a;//4
    echo "<br/>";
    
    echo $arr->count();//实现了Countable接口的方法,4
    echo "<br/>";
    
    $a = count($arr);//数组实现了Countable,php数组提供的count方法也可用
    echo $a;//4
    echo "<br/>";
    
    //实现Iterator中的方法
    
    /*
     *        移动指针方法:          rewind(),next(),都只移动指针,无返回值,是一个动作 
     *        取键值的方法:          key(),current() 返回当前指针指向的index 和element
     *        检查指针方法:          valid() 检查当前指针是否超出数组范围,返回bool值
     * 
     */
    
    $arr->rewind();//重置指针,指向开头处,无返回值
    $a = $arr->current();//返回当前指针指向的值
    var_dump($a);
    echo PHP_EOL;
    $arr->next();//移动指针,将指针指向下一位,无返回值
    $a = $arr->valid();//检测当前指针是否有效,也就是说当前指针是否超出数组范围
    var_dump($a);
    $a = $arr->current();//返回当前指针指向的值
    var_dump($a);
    echo PHP_EOL;
    echo $arr->key();//返回当前指针指向的key
    $arr->next();
    $arr->next();
    $arr->next();//移出了数组范围,
    var_dump($arr->valid());//检测返回false
    
    /*======================================
     * 
     * offsetget(index) = $arr[$index]//获取索引对应的元素值
     * offserget(index,element) = ($arr[$index]=$element)//修改index对应的element
     * offsetUnset(index) = unset($arr[$index])//释放index对应的element
     * offsetExists(index) = isset($arr[$index])//判断index是否存在
     * 
     *=======================================*/
    $a = $arr->offsetGet(3); // 相当于 $arr[3]
    var_dump($a);//d
    echo $arr[3];//d
    echo PHP_EOL;
    
    $arr->offsetSet(3,'e');//相当于$arr[3] = 'e';
    echo $arr[3];
    $arr[3] = 'd';
    echo PHP_EOL;
    echo $arr[3];
    
    $arr->offsetUnset(3);//相当于unset($arr[3]);
    var_dump($arr[3]);//null
    
    $m = $arr->offsetExists(3);//相当于isset($arr[3])
    var_dump($m);
    
    
    
    
    
    
    
    
    /*=======SplFixedArray()与PHP数组的转化函数======  
    
           方法 fromAaary() : 将一个PHP普通数组转化成SPL数组,静态方法SplFixedArray::fromArray(),
          方法       toArray() :将一个SPL数组转化成PHP普通数组 ,无参数,返回PHP普通数组
    
    =============================================*/
    
    $arr = $arr->toArray();
    var_dump($arr);//返回普通php数组
    
    $arr = array(1=>3,0=>1,4=>2);//普通PHP数组
    $arr = SplFixedArray::fromArray($arr);//第二个参数是默认true,表示保持原来的索引关系。false表示舍弃原来的索引
    var_dump($arr);//返回SPL数组
    
    $arr = array(1=>3,0=>1,4=>2);//普通PHP数组
    $arr = SplFixedArray::fromArray($arr,false);//舍弃原来的索引关系
    var_dump($arr);//返回SPL数组
    
    
    ?>
    

      接下来是双向链表

    <?php 
    /**
     * SPL双向队列SplDoublyLinkedList(),实现了Iterator , ArrayAccess , Countable接口
     */
    
    
    $linklist = new SplDoublyLinkedList();
    
    $linklist->push('a');//插入元素
    $linklist->push('b');
    $linklist->push('c');
    $linklist->push('d');
    
    var_dump($linklist->getIteratorMode());
    
    
    /*
     * Iterator 系列方法
     */
    $linklist->rewind();//指针指向开头,动作,无返回值
    $linklist->next();//移动指针,动作,无返回值
    var_dump($linklist->key());//返回当前指针指向的index
    var_dump($linklist->current());//返回当前指针指向的element
    var_dump($linklist->valid());//检测指针是否移出链表
    
    //补充
    $linklist->prev();//指针向前移动,对应next向后
    var_dump($linklist->current());
    
    /*
     * ArrayAccess 系列方法
     */
    //offSetGet offsetSet  offsetExists  offsetUnset 和SplFixedArray的一样,按照数组方式的几个操作
    foreach ($linklist as $value){//可以像foreach遍历
    	echo $value;
    	echo PHP_EOL;
    }
    
    var_dump($linklist[0]);//以数组方式取值
    echo count($linklist);//4,数组方式
    echo PHP_EOL;
    
    
    /*
     * Countable()方法
     */
    echo $linklist->count();//4
    
    
    /*
     * 自身特有方法
     */
    
    $linklist->rewind();//指针指向底部,这个函数要常用
    
    //add()方法在5.5.0以上的版本才存在,将一个值插入链表某个位置,和原来的值形成链表,也就是这个节点的多个值链接成一个链表
    //serialize()/unserialize()两个函数在5.4.0以上的版本中才能使用,序列化和反序列化使用
    
    var_dump($linklist->isEmpty());//判断是否为空
    $linklist->push('e');//往顶部插入元素
    $linklist->unshift('A');//往底部插入元素
    
    var_dump($linklist->top());//返回顶部元素,后插入的在顶部
    var_dump($linklist->bottom());//返回底部元素,先插入的在底部
    
    var_dump($linklist->pop());//弹出顶部元素
    var_dump($linklist->shift());//弹出底部元素
    
    $linklist->setIteratorMode(SplDoublyLinkedList::IT_MODE_DELETE);//这两个是一对,暂不清楚具体怎么用的
    var_dump($linklist->getIteratorMode());
    
    
    
    ?>
    

      

  • 相关阅读:
    替换html里面的 及解决记事本中的每个段落只有一行的情形
    关于 'list' object has no attribute 'select'
    python写爬虫的弯路
    将博客搬至CSDN
    转载:如何让spring mvc web应用启动时就执行
    java开发人员,最应该学习和熟练使用的工具类。google guava.(谷歌 瓜娃)
    解决svn问题:Wrong committed revision number: -1
    生产环境中,数据库升级维护的最佳解决方案flyway
    在JaveWeb项目中配置Spring 匿名访问时,匹配规则的变相实现/*
    nexus的使用
  • 原文地址:https://www.cnblogs.com/taijun/p/4209227.html
Copyright © 2011-2022 走看看