0

这是我正在使用的课程:

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);
    }
}

当我获取根类别时它工作得很好..意味着当第一个字段parentzero..但是如果我在树之间获取类别..那么它会失败..因为它只有在第一个数组为零时才有效..

例如这个数组:

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

4

1 回答 1

0

我自己解决了..在这里发布解决方案以防将来有人想使用它:

初始化类时,我需要传递当前的父 id,然后它就会全部设置好。

$recurdata = RecursiveCategoryIterator::createFromResult($result,$current_parent_id);

然后在递归类中,添加这个作为回报:

public static function createFromResult($result,$root_id) {
        //$this->root_id=$current_cat_id;
        $menu_array = array();
        while($row = mysql_fetch_assoc($result)) {
            $menu_array[$row[self::PARENT_FIELD]][] = $row;
        }

        return new self($menu_array,$root_id);
    }

看到$root_id这里被传递了..然后它会像魅力一样工作:)

希望它对将来的人有所帮助:)

于 2012-10-16T04:24:55.563 回答