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 に答える