PHP5.3 以降、SPL ( Standard PHP Libraly ) に SplStack と SplQueue クラスが追加され簡単にスタック構造とキュー構造を扱うことができるようになりました。
スポンサーリンク
SplStack と SplQueue クラスの使用例
$stack = new SplStack(); // スタックに配列のように要素を追加する場合 $stack[] = 1; $stack[] = 2; // push メソッドを使って要素を追加する $stack->push(3); // スタックなのでファーストインラストアウトとなる var_dump($stack->pop()); // int 3 var_dump($stack->pop()); // int 2 var_dump($stack->pop()); // int 1 // 要素が空か確認する var_dump($stack->isEmpty()); // true $queue = new SplQueue(); // キューに配列のように要素を追加する場合 $queue[] = 1; $queue[] = 2; // enqueue メソッドを使って要素を追加する $queue->enqueue(3); // キューなのでファーストインファーストアウトとなる var_dump($queue->dequeue()); // int 1 var_dump($queue->dequeue()); // int 2 var_dump($queue->dequeue()); // int 3 // 要素が空か確認する var_dump($queue->isEmpty()); // true
SplStack と SplQueue クラスへシリアライズ機能を追加
次に、SplStack と SplQueue クラスで扱うデータのシリアライズとデシリアライズ機能を追加してみます。なお、このサンプルは ZendFramework-2.0.0 ( bata4 ) 内のクラスです。
シリアライズ機能つき SplStack クラス
namespace Zend\Stdlib;
use Serializable;
/*
* SplStackクラスを継承し同名(名前空間違い)のクラスを作成
*/
class SplStack extends \SplStack implements Serializable
{
public function toArray()
{
$array = array();
foreach ($this as $item) {
$array[] = $item;
}
return $array;
}
/**
* シリアライズ
*/
public function serialize()
{
return serialize($this->toArray());
}
/**
* デシリアライズ
*/
public function unserialize($data)
{
foreach (unserialize($data) as $item) {
$this->unshift($item);
}
}
}
シリアライズ機能つき SplQueue クラス
namespace Zend\Stdlib;
use Serializable;
/*
* SplQueueクラスを継承し同名(名前空間違い)のクラスを作成
*/
class SplQueue extends \SplQueue implements Serializable
{
public function toArray()
{
$array = array();
foreach ($this as $item) {
$array[] = $item;
}
return $array;
}
/**
* シリアライズ
*/
public function serialize()
{
return serialize($this->toArray());
}
/**
* デシリアライズ
*/
public function unserialize($data)
{
foreach (unserialize($data) as $item) {
$this->push($item);
}
}
}
動作検証
$stack = new Zend\Stdlib\SplQueue(); // スタックにデータを追加する $stack[] = 1; $stack[] = 2; // スタックにあるデータをシリアライズする $ret = $stack->serialize(); // スタックからデータを取り出す var_dump($stack->pop()); // int 2 var_dump($stack->pop()); // int 1 var_dump($stack->count()); // int 0 // シリアライズしたデータをデシリアライズで戻す $stack->unserialize($ret); // 再度スタックからデータを取得できる var_dump($stack->pop()); // int 2 var_dump($stack->pop()); // int 1