ホームページ >バックエンド開発 >PHPチュートリアル >リストを使用してツリー データを処理する (隣接リスト)

リストを使用してツリー データを処理する (隣接リスト)

WBOY
WBOYオリジナル
2016-06-23 14:00:47901ブラウズ

次の出力

$d = array(  array( '公告', 1, 0 ),  array( '文章', 2, 0 ),  array( '文章1', 3, 2 ),  array( '文章2', 4, 2),  array( '文章1评论', 5, 3 ),  array( '文章2评论', 6, 4 ),  array( '文章1评论1', 7, 3 ),  array( '文章1评论评论', 8, 5 ),);
を期待する既存の配列
公告文章  文章1    文章1评论      文章1评论评论    文章1评论1  文章2    文章2评论
があります
したがって、
foreach($d as $t) list($a[$pid][$id], $id, $pid) = $t;
get
Array(    [0] => Array        (            [1] => 公告            [2] => 文章        )    [2] => Array        (            [3] => 文章1            [4] => 文章2        )    [3] => Array        (            [5] => 文章1评论            [7] => 文章1评论1        )    [4] => Array        (            [6] => 文章2评论        )    [5] => Array        (            [8] => 文章1评论评论        ))
を実行すると、データが 3 番目の列に従ってクラスター化されていることがわかります
したがって、再帰関数を使用してデータを表示できます
function foo($ar, $pid=0, $deep=0) {  foreach($ar[$pid] as $k=>$v) {    printf("%s%s\n", str_repeat(' ', $deep), $v);    if(isset($ar[$k])) foo($ar, $k, $deep+2);  }}
は foo( を呼び出します) $a);


ディスカッション (解決策) に返信します

モデレータは良い人です


竹は無限の木に弱いです。
見るたびに何か新しいものを得ることができます。

最前列学習

学習中。笑

つまり、そのように動作します。

とても簡潔で、とても勉強になりました。

よく書かれていて、そこから学びました

  static void Main(string[] args)        {            double a, b, c, p, h, area;            Console.Write("请输入三角形的边A: ");            string s = Console.ReadLine();            a = double.Parse(s);            Console.Write("请输入三角形的边B: ");            s = Console.ReadLine();            b = double.Parse(s);            Console.Write("请输入三角形的边C: ");            s = Console.ReadLine();            c = double.Parse(s);            if (a > 0 && b > 0 && c > 0 && a + b > c && a + c > b && b + c > a)            {                Console.WriteLine("三角形的三边分别为:a={0},b={1},c={2}", a, b, c);                p = a + b + c;                h = p / 2;                area = Math.Sqrt(h * (h - a) * (h - b) * (h - c));                Console.WriteLine("三角形的周长={0},面积={1}",p,area);            }            else Console.WriteLine("无法构成三角形!");            Console.ReadKey();        }

申し訳ありませんが、上記は間違って送信されました。 。 。故意にやったわけではありません。 。このエディタの機能を試してみたいです

勉強になりました

ニウ勉強になりました

とても良かった、勉強になりました

サポートしてください

ハオ...

観察して、学び、サポートして、ポイントを受け取ります

勉強になりました。

共有してくれてありがとう

共有してくれてありがとう、私は学んでいます!

学べました

素晴らしいスキル

シンプルで明快なツリーは再帰を使用するのに常に便利です

本当に良くて便利です、学ぶことができます

LZ のアイデアは私が使用しているものと同じですが、コードは大幅に異なります私よりも劣っていて、私よりもはるかに賢い。

このアルゴリズムの考え方は、parent_id をキー名として 2 番目の配列を作成し、この配列を再帰的に呼び出すことです。

array(2978) {  [0]=>  object(stdClass)#1 (4) {    ["id"]=>    string(8) "50094064"    ["subject"]=>    string(22) "在线影视/电子书"    ["parent_id"]=>    int(0)    ["type_id"]=>    int(0)  }.........

上記は分類で生成されたオブジェクトをテキスト テキストに保存することに慣れていますが、生成されたオブジェクトにはカスタム キー名があり、array_values を使用してそれらを取り出すことはできません。 listを再度使用すると正常に動作しません。$tの要素キー名が異常のままです。

rreee

そこで、再度変更したところ、機能しました。

りー


ただし、立場は変わりました。

うーん、もう機能しません。リストの説明を長い間読みましたが、答えが見つかりませんでした。

私のオリジナルのメソッドを添付します。

リストを 2 次元配列に変換するには、次のようにします。個人的には下手な方法を採用しています。 ソース配列は上記と同様です

//源数组 转化了数组 下面是foreach里面的内容 这个list形式不能用$t=array_values($t);list($id,$a[$pid][$t[$id],$pid,$tid) = $t;

$tmp は、LZ メソッドに相当する配列 $a をプロジェクトファイルから取り出してコントローラーに書き込みます。変更されません
//源数据转换成了对象foreach($object_tmp as $t) {	$t=array($t->subject,$t->id,$t->parent_id);	list($a[$pid][$id],$id,$pid) = $t;}


JavaScript に変更するのが最善です

学びましょう はい、悪くありません

悪くありません、悪くありません、これを保存する必要があります。

いいですね、とてもシンプルで便利です

そうです、これは保存しなければなりません。

方法がとても簡単であることを学びました


方法がとても簡単であることを学びました

学んだ

読んで...

これは以前にもやったことがありますが、データベースから取得する再帰関数を直接書きました。

とても大きくて、トリック

観察して、学んで、サポートして、ポイントを受け取りましょう

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。