これは私が使用しているクラスです:
class RecursiveCategoryIterator implements RecursiveIterator {
const ID_FIELD = 'cat_ID';
const PARENT_FIELD = 'parent';
private $_data;
private $_root;
private $_position = 0;
public function __construct(array $data, $root_id='0') {
$this->_data = $data;
$this->_root = $root_id;
}
public function valid() {
return isset($this->_data[$this->_root][$this->_position]);
}
public function hasChildren() {
$subid = $this->_data[$this->_root][$this->_position][self::ID_FIELD];
return isset($this->_data[$subid])
&& is_array($this->_data[$subid]);
}
public function next() {
$this->_position++;
}
public function current() {
return $this->_data[$this->_root][$this->_position];
}
public function getChildren() {
return new self($this->_data,
$this->_data[$this->_root][$this->_position][self::ID_FIELD]);
}
public function rewind() {
$this->_position = 0;
}
public function key() {
return $this->_position;
}
public static function createFromResult($result) {
$menu_array = array();
while($row = mysql_fetch_assoc($result)) {
$menu_array[$row[self::PARENT_FIELD]][] = $row;
}
return new self($menu_array);
}
}
ルートカテゴリをフェッチすると完全に機能します。つまり、最初のフィールドparent
がzero
..の場合ですが、ツリー間でカテゴリをフェッチすると、失敗します。最初の配列がゼロとして取得された場合にのみ機能するためです。
たとえば、この配列:
RecursiveCategoryIterator Object
(
[_data:RecursiveCategoryIterator:private] => Array
(
[1] => Array
(
[0] => Array
(
[cat_ID] => 27
[cat_name] => Local Guess Papers
[cat_nicename] => local-guess-paper
[parent] => 1
[post_count] => 5
[depth] => 0
)
)
[27] => Array
(
[0] => Array
(
[cat_ID] => 28
[cat_name] => Class IX
[cat_nicename] => class-9
[parent] => 27
[post_count] => 0
[depth] => 1
)
[1] => Array
(
[cat_ID] => 34
[cat_name] => Class X
[cat_nicename] => class-10
[parent] => 27
[post_count] => 0
[depth] => 1
)
[2] => Array
(
[cat_ID] => 40
[cat_name] => Class XI
[cat_nicename] => class-11
[parent] => 27
[post_count] => 0
[depth] => 1
)
[3] => Array
(
[cat_ID] => 46
[cat_name] => Class XII
[cat_nicename] => class-12
[parent] => 27
[post_count] => 0
[depth] => 1
)
)
[28] => Array
(
[0] => Array
(
[cat_ID] => 29
[cat_name] => Year 2010
[cat_nicename] => year-2010
[parent] => 28
[post_count] => 0
[depth] => 2
)
[1] => Array
(
[cat_ID] => 30
[cat_name] => Year 2007
[cat_nicename] => year-2007-guess
[parent] => 28
[post_count] => 4
[depth] => 2
)
[2] => Array
(
[cat_ID] => 31
[cat_name] => Year 2008
[cat_nicename] => year-2008-guess
[parent] => 28
[post_count] => 4
[depth] => 2
)
[3] => Array
(
[cat_ID] => 32
[cat_name] => Year 2009
[cat_nicename] => year-2009-guess
[parent] => 28
[post_count] => 2
[depth] => 2
)
[4] => Array
(
[cat_ID] => 33
[cat_name] => Year 2006
[cat_nicename] => year-2006-cbse-guess-paper
[parent] => 28
[post_count] => 3
[depth] => 2
)
)
)
[_root:RecursiveCategoryIterator:private] => 0
[_position:RecursiveCategoryIterator:private] => 0
)
何も返さないのでfirst element is NOT zero
このクラスを使用できる関数は次のとおりです。
$sql='some sql to retrive data';
$result = mysql_query($sql);
$recurdata = RecursiveCategoryIterator::createFromResult($result);
makecat($recurdata,'','');
function makecat($iterator, $parent_name,$category) {
foreach($iterator as $row) {
echo(''.$row['cat_name'].'');
if($iterator->hasChildren()) {
makecat($iterator->getChildren(), $row['cat_name'],$category);
}
}
}
だから私はツリーの真ん中からフェッチされたときにどのようにデータを表示するのか知りたいのですがwhen first parent is not the zero
?