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