PHP中的SPL学习

SplDoublyLinkedList是PHP的双向链表类,在JAVA中也有类似的概念(集合框架),在PHP使用数组是非常方便的,但是有这个类,我们还是可以了解学习一下

使用类的好处,就是你可以对这个类进行扩展补充等,虽然类并没有像array那样使用的很方便,但是功能比数组要多的多.

双链表是一种重要的线性存储结构,对于双链表中的每个节点,不仅仅存储自己的信息,还要保存前驱和后继节点的地址。

SplDoublyLinkedList implements Iterator  , ArrayAccess  , Countable  {
  
  public __construct ( void )
  public void add ( mixed $index , mixed $newval )
  //双链表的尾部节点
  public mixed top ( void )
  //双链表的头节点
  public mixed bottom ( void )
  
//双联表元素的个数
  public int count ( void )
  //检测双链表是否为空
  public bool isEmpty ( void )
  
  
  //当前节点索引
  public mixed key ( void )
  //移到上条记录
  public void prev ( void )
  //移到下条记录
  public void next ( void )
  //当前记录
  public mixed current ( void )
  //将指针指向迭代开始处
  public void rewind ( void )
  //检查双链表是否还有节点
  public bool valid ( void )
  
  //指定index处节点是否存在
  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 )
  
  //从双链表的尾部弹出元素
  public mixed pop ( void )
  //添加元素到双链表的尾部
  public void push ( mixed $value )
  
  //序列化存储
  public string serialize ( void )
  //反序列化
  public void unserialize ( string $serialized )
  
  //设置迭代模式
  public void setIteratorMode ( int $mode )
  //获取迭代模式SplDoublyLinkedList::IT_MODE_LIFO (Stack style) SplDoublyLinkedList::IT_MODE_FIFO (Queue style)
  public int getIteratorMode ( void )
  
  //双链表的头部移除元素
  public mixed shift ( void )
  //双链表的头部添加元素
  public void unshift ( mixed $value ) 
}

上面就是这个类我们可以使用的所有方法, 这些方法也很简单。

$spl =  new SplDoublyLinkedList();

直接构造这个对象,使用他的方法就可以了,值得一提的是,这个类十分像javascript中的数组方法,可以push,shift等

我们push几条数据,然后打印看下数据表示结构

SplDoublyLinkedList Object
(
    [flags:SplDoublyLinkedList:private] => 0
    [dllist:SplDoublyLinkedList:private] => Array
        (
            [0] => 123
            [1] => aaa
            [2] => 444
        )
) 

PHP堆栈类SplStack,与双向链表方法一致,

特点:先进后出
实际上是双向链表的子类,也push三条数据,我们打印看看他的结构,

SplStack Object
(
    [flags:SplDoublyLinkedList:private] => 6
    ........
) 

与双向链表差不多但是还是有一点小区别,这里的标志是6,类是SplStack

PHP队列类SplQueue

,与双向链表方法一致,特点:先进先出
我们也看下他的结构

 SplQueue Object
(
    [flags:SplDoublyLinkedList:private] => 4
    ........
) 

这里的标识是4,在该类中可以使用以下两个方法

enqueue          //进入队列
dequeue          //退出队列

ArrayIterator遍历元素

$arr = array(
  'url' =>"cwj95.com",
  'title' =>"正励志",
  'web' =>"cwj95.com"
);   //   我们先用一个数组为例

//最简单的foreach循环
foreach ($arr as $key => $value) {
echo $key ."  ====  ". $value ."
";
}

//想要使用迭代器,必须先生成对象
/*
如果是使用
$arr = new SplDoublyLinkedList();
$arr->push('vvv');
$arr->push('123');
$arr->push('nnsdds');

这样的双向链表,可以直接使用,而不需要包装转换,因为在这个类中是实现了ArrayObject的一定的规范
*/
$obj = new ArrayObject($arr);
$it = $obj ->getIterator();

//与上面的foreach循环一样,其实上面的foreach也是通过包装好使用迭代器实现
foreach ($it as $key => $value) {
echo $key ."  ====  ". $value ."
";
}

//使用while循环遍历数组
$it->rewind();
while ($it->valid()) {
echo $it->key() ."  ====  ". $it->current() ."
";
$it->next();
}

AppendIterator迭代器

这个迭代器能陆续遍历几个迭代器

//构造两个数组迭代器
$a = new ArrayIterator(array(1,2,3));
$b = new ArrayIterator(array(4,5,6));

$append = new AppendIterator();
//添加两个迭代器
$append -> append($a);
$append -> append($b);

foreach ($append as $key => $value) {
echo $key . ' === ' . $value . "
";  
/*使用迭代器输出, 可以看到两个迭代器一起遍历输出了
0 === 1
1 === 2
2 === 3
0 === 4
1 === 5
2 === 6
*/
}

MultipleIterator迭代器

可以将指定多个迭代器拼合成一个二维数组,拼合后的值会是一个数组。

$mu = new MultipleIterator(MultipleIterator::MIT_KEYS_ASSOC);

$mu -> attachIterator($a,"id");
$mu -> attachIterator($b,"name");

foreach ($mu as $value) {
print_r($value);      //这里的key是无效的,都是0
}
/*
打印输出
Array(    [id] => 1    [name] => 4)
Array(    [id] => 2    [name] => 5)
Array(    [id] => 3    [name] => 6)
*/

FilesystemIterator迭代器

这个迭代器是针对文件系统的,可以迭代出目录和其相关系统,例:

$file = new FilesystemIterator('.');

foreach ($file as $file_info) {   // 每个元素都是 文件的信息对象
echo $file_info -> isdir() ? "目录:" : "文件:";
echo $file_info -> getFileName() . "
";

}

SPL技术接口

发表评论

发表回复

*

沙发空缺中,还不快抢~