1--TEST-- 2sqlite-spl: Iteration 3--SKIPIF-- 4<?php # vim:ft=php 5if (!extension_loaded("sqlite")) print "skip"; 6if (!extension_loaded("spl")) print "skip SPL is not present"; 7?> 8--FILE-- 9<?php 10include "blankdb_oo.inc"; 11 12$db->query("CREATE TABLE menu(id_l int PRIMARY KEY, id_r int UNIQUE, key VARCHAR(10))"); 13$db->query("INSERT INTO menu VALUES( 1, 12, 'A')"); 14$db->query("INSERT INTO menu VALUES( 2, 9, 'B')"); 15$db->query("INSERT INTO menu VALUES(10, 11, 'F')"); 16$db->query("INSERT INTO menu VALUES( 3, 6, 'C')"); 17$db->query("INSERT INTO menu VALUES( 7, 8, 'E')"); 18$db->query("INSERT INTO menu VALUES( 4, 5, 'D')"); 19 20class SqliteNestedsetElement 21{ 22 protected $id_l; 23 protected $id_r; 24 protected $key; 25 26 function __construct($db) 27 { 28 $this->db = $db; 29 } 30 31 function getLeft() 32 { 33 return $this->id_l; 34 } 35 36 function getRight() 37 { 38 return $this->id_r; 39 } 40 41 function __toString() 42 { 43 return $this->key; 44 } 45 46 function key() 47 { 48 return $this->key; 49 } 50} 51 52class SqliteNestedset implements RecursiveIterator 53{ 54 protected $id; 55 protected $id_l; 56 protected $id_r; 57 protected $entry; 58 59 function __construct($db, $id_l = 1) 60 { 61 $this->db = $db; 62 $this->id_l = $id_l; 63 $this->id_r = $this->db->singleQuery('SELECT id_r FROM menu WHERE id_l='.$id_l, 1); 64 $this->id = $id_l; 65 } 66 67 function rewind() 68 { 69 $this->id = $this->id_l; 70 $this->fetch(); 71 } 72 73 function valid() 74 { 75 return is_object($this->entry); 76 } 77 78 function current() 79 { 80 return $this->entry->__toString(); 81 } 82 83 function key() 84 { 85 return $this->entry->key();; 86 } 87 88 function next() 89 { 90 $this->id = $this->entry->getRight() + 1; 91 $this->fetch(); 92 } 93 94 protected function fetch() 95 { 96 $res = $this->db->unbufferedQuery('SELECT * FROM menu WHERE id_l='.$this->id); 97 $this->entry = $res->fetchObject('SqliteNestedsetElement', array(&$this->db)); 98 unset($res); 99 } 100 101 function hasChildren() 102 { 103 return $this->entry->getLeft() + 1 < $this->entry->getRight(); 104 } 105 106 function getChildren() 107 { 108 return new SqliteNestedset($this->db, $this->entry->getLeft() + 1, $this->entry->getRight() - 1); 109 } 110} 111 112$menu_iterator = new RecursiveIteratorIterator(new SqliteNestedset($db), RecursiveIteratorIterator::SELF_FIRST); 113foreach($menu_iterator as $entry) { 114 echo $menu_iterator->getDepth() . $entry . "\n"; 115} 116?> 117===DONE=== 118--EXPECT-- 1190A 1201B 1212C 1223D 1232E 1241F 125===DONE=== 126