
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技术接口
原创文章转载请注明:转载自:PHP中的SPL学习
发表评论
沙发空缺中,还不快抢~