ホームページ >バックエンド開発 >PHPチュートリアル >リストを使用してツリー データを処理する (隣接リスト)
次の出力
$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;
//源数据转换成了对象foreach($object_tmp as $t) { $t=array($t->subject,$t->id,$t->parent_id); list($a[$pid][$id],$id,$pid) = $t;}
そうです、これは保存しなければなりません。
方法がとても簡単であることを学びました
方法がとても簡単であることを学びました
読んで...
これは以前にもやったことがありますが、データベースから取得する再帰関数を直接書きました。
とても大きくて、トリック
観察して、学んで、サポートして、ポイントを受け取りましょう