1

私は実際にZFに取り組んでいます。以下のようにデータを表示するためにツリーを作成したいカテゴリテーブルがあります。

Category
--Sub cat 1
--Sub cat 2
----Su sub cat 1
Another Category
--Sub cat 1
//...etc...

メソッドを使用してfetchAllすべてのデータを取得しています。すべて正常に動作します。しかし、その後、以下のようにツリーを二重の foreach ループに作成しようとしています。

$tree = array();
foreach($data as $parent){
    $tree[$parent->name] = array();
    foreach($data as $child){
        if($child->parent_id == $parent->id){
            $tree[$parent->name][] = $child->name;
        }
    }
}

問題は、ループの最初の繰り返しの後にループが停止するmainことです。そのため、最初の親を取得しているだけで、それはサブカテゴリですが、2 番目の親には続きません。

次のフィールドとしての私のデータベーステーブル:

id, name, parent_id

何か案が?

編集 Thibault のおかげで、古き良きforループを使用して動作しました:

for($i=0;$i<count($data);$i++){
    $tree[$data[$i]->name] = array();
    for($j=0;$j<count($data);$j++){
        if($data[$j]->parent_id == $data[$i]->id){
            $tree[$data[$i]->name][] = $data[$j]->name;
        }
    }
}
4

1 に答える 1

0

$data両方の変数のカーソル間で競合が発生する可能性があります。

2 番目のループには$datafor のコピーを使用する必要があります。foreach

または、インデックスforと一緒にループを使用し、配列にアクセスするためにandを介して呼び出して、ループがめちゃくちゃにならないようにします。$i$j$data[$i]$data[$j]

EDIT ハッピー私は助けることができましたが、いくつかの調査の後、私はこのコードを作成しました:

<?

class o {
 public $id;
 public $name;
 public $parent_id;
 function __construct($_id,$_name,$_parent) {
  $this->id = $_id;
  $this->name = $_name;
  $this->parent_id = $_parent;
 }
}
$data = array(
 new o(1,'toto',0),
 new o(2,'truc',1),
 new o(3,'machin',1),
 new o(4,'bidule',2),
 new o(5,'titi',3),
 new o(6,'tutu',3),
);


$tree = array();
foreach($data as $parent){
    $tree[$parent->name] = array();
    foreach($data as $child){
        if($child->parent_id == $parent->id){
            $tree[$parent->name][] = $child->name;
        }
    }
}

print_r($tree);

そして、あなたのコードはうまく動作します:(どこかで何かが間違っているに違いありません...)

Array
(
    [toto] => Array
        (
            [0] => truc
            [1] => machin
        )

    [truc] => Array
        (
            [0] => bidule
        )

    [machin] => Array
        (
            [0] => titi
            [1] => tutu
        )

    [bidule] => Array
        (
        )

    [titi] => Array
        (
        )

    [tutu] => Array
        (
        )

)
于 2013-04-04T08:07:52.160 に答える