PHP递归类别迭代器问题

时间:2012-10-15 14:58:04

标签: php recursion tree

这是我正在使用的课程:

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

1 个答案:

答案 0 :(得分: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 ..然后它将像魅力一样工作:)

希望将来帮助某人:)