Inhaltsverzeichnis
回复讨论(解决方案)
Heim Backend-Entwicklung PHP-Tutorial 用 list 处理树状数据(邻接列表)

用 list 处理树状数据(邻接列表)

Jun 23, 2016 pm 02:00 PM

现有一个数组

$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 ),);
Nach dem Login kopieren
期望如下输出
公告文章  文章1    文章1评论      文章1评论评论    文章1评论1  文章2    文章2评论
Nach dem Login kopieren

于是可以
foreach($d as $t) list($a[$pid][$id], $id, $pid) = $t;
Nach dem Login kopieren
得到
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评论评论        ))
Nach dem Login kopieren
可以看到,数据按第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);  }}
Nach dem Login kopieren
调用 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();        }
Nach dem Login kopieren

不好意思,上面那个发错了。。。我不是故意的。。我是想试一下这个编辑器的功能

学习了

牛X,学习了








http://www.javadad.com

学习了 版主

不错,学习学习了

很不错,学习了

支持一下

hao......

观摩,学习,支持,接分

学习了。

谢谢楼主分享

谢谢楼主分享,学习啦!

学习了

眩技那

简洁明了 树 总是用递归方便

真的很不错,很有用,可以学习学习

LZ的思路和我用的思路是一样的,但代码比我的要少很多,比我高明多了。

这种算法的思路就是建立一人以parent_id为键名的二级数组,用递归调用这个数组。

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

上面是组织形式,个人习惯把这分类生成对象保存到txt文本里面,生成的有自定义键名,不能直接list(),用array_values取出后,再用list还是不正常,又换了$t的元素键名,还是不正常。
//源数组 转化了数组 下面是foreach里面的内容 这个list形式不能用$t=array_values($t);list($id,$a[$pid][$t[$id],$pid,$tid) = $t;
Nach dem Login kopieren

于是又改了一下,能用了。
//源数据转换成了对象foreach($object_tmp as $t) {	$t=array($t->subject,$t->id,$t->parent_id);	list($a[$pid][$id],$id,$pid) = $t;}
Nach dem Login kopieren


不过,换了一位置。
//源数据转换成了对象foreach($object_tmp as $t) {	$t=array($t->id,$t->subject,$t->parent_id);	list($id,$a[$pid][$id],$pid) = $t;}
Nach dem Login kopieren

又不能用了,看了半天list的说明,也没能找到答案

附上本人原来的做法:
对于list转化二维数组的,个人采取比较笨拙的方法,源数组与上面的类似

//以父级id为键名的  更多一维的(一般3维)数组		$tmp=array();		foreach ($item_category as $it){			if( count($tmp[$it["parent_id"]]) ){				$tmp[$it["parent_id"]][count($tmp[$it["parent_id"]])]=$it;			}else{				$tmp[$it["parent_id"]][0]=$it;			}		}
Nach dem Login kopieren

$tmp就是相当于LZ方法的数组$a

从项目文件里面拿出来的,写在控制器里面的,就不改了
//用于存放数据(整理好的)的公共变量	var $sorta=array();	//树形排序核心部分  pid:父级起始  tmp以父级id为第一维的数组	public function get_all_($pid,$tmp){			$tt=$tmp[$pid];			foreach($tt  as $ttt){				$this->sorta[count($this->sorta)]=$ttt;				$this->get_all_($ttt["id"],$tmp);			}	}
Nach dem Login kopieren

换成javascript的就最好

学习了,不错

不错不错,这个必须收藏一下。

好   很简单  方便了

错不错,这个必须收藏一下。

学习了    方法很简便

学习了    方法很简便

学习了

已阅..

前面也做过这个,不过是直接写递归函数从数据库取的。

很?大,又?到一招

观摩,学习,支持,接分

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Arbeiten mit Flash -Sitzungsdaten in Laravel Arbeiten mit Flash -Sitzungsdaten in Laravel Mar 12, 2025 pm 05:08 PM

Laravel vereinfacht die Behandlung von temporären Sitzungsdaten mithilfe seiner intuitiven Flash -Methoden. Dies ist perfekt zum Anzeigen von kurzen Nachrichten, Warnungen oder Benachrichtigungen in Ihrer Anwendung. Die Daten bestehen nur für die nachfolgende Anfrage standardmäßig: $ Anfrage-

Curl in PHP: So verwenden Sie die PHP -Curl -Erweiterung in REST -APIs Curl in PHP: So verwenden Sie die PHP -Curl -Erweiterung in REST -APIs Mar 14, 2025 am 11:42 AM

Die PHP Client -URL -Erweiterung (CURL) ist ein leistungsstarkes Tool für Entwickler, das eine nahtlose Interaktion mit Remote -Servern und REST -APIs ermöglicht. Durch die Nutzung von Libcurl, einer angesehenen Bibliothek mit Multi-Protokoll-Dateien, erleichtert PHP Curl effiziente Execu

Vereinfachte HTTP -Reaktion verspottet in Laravel -Tests Vereinfachte HTTP -Reaktion verspottet in Laravel -Tests Mar 12, 2025 pm 05:09 PM

Laravel bietet eine kurze HTTP -Antwortsimulationssyntax und vereinfache HTTP -Interaktionstests. Dieser Ansatz reduziert die Code -Redundanz erheblich, während Ihre Testsimulation intuitiver wird. Die grundlegende Implementierung bietet eine Vielzahl von Verknüpfungen zum Antworttyp: Verwenden Sie Illuminate \ Support \ facades \ http; Http :: fake ([ 'Google.com' => 'Hallo Welt',, 'github.com' => ['foo' => 'bar'], 'Forge.laravel.com' =>

PHP -Protokollierung: Best Practices für die PHP -Protokollanalyse PHP -Protokollierung: Best Practices für die PHP -Protokollanalyse Mar 10, 2025 pm 02:32 PM

Die PHP -Protokollierung ist für die Überwachung und Debugie von Webanwendungen von wesentlicher Bedeutung sowie für das Erfassen kritischer Ereignisse, Fehler und Laufzeitverhalten. Es bietet wertvolle Einblicke in die Systemleistung, hilft bei der Identifizierung von Problemen und unterstützt eine schnellere Fehlerbehebung

12 Beste PHP -Chat -Skripte auf Codecanyon 12 Beste PHP -Chat -Skripte auf Codecanyon Mar 13, 2025 pm 12:08 PM

Möchten Sie den dringlichsten Problemen Ihrer Kunden in Echtzeit und Sofortlösungen anbieten? Mit Live-Chat können Sie Echtzeitgespräche mit Kunden führen und ihre Probleme sofort lösen. Sie ermöglichen es Ihnen, Ihrem Brauch einen schnelleren Service zu bieten

Erklären Sie das Konzept der späten statischen Bindung in PHP. Erklären Sie das Konzept der späten statischen Bindung in PHP. Mar 21, 2025 pm 01:33 PM

In Artikel wird die in PHP 5.3 eingeführte LSB -Bindung (LSB) erörtert, die die Laufzeitauflösung der statischen Methode ermöglicht, um eine flexiblere Vererbung zu erfordern. Die praktischen Anwendungen und potenziellen Perfo von LSB

Anpassung/Erweiterung von Frameworks: So fügen Sie benutzerdefinierte Funktionen hinzu. Anpassung/Erweiterung von Frameworks: So fügen Sie benutzerdefinierte Funktionen hinzu. Mar 28, 2025 pm 05:12 PM

In dem Artikel werden Frameworks hinzugefügt, das sich auf das Verständnis der Architektur, das Identifizieren von Erweiterungspunkten und Best Practices für die Integration und Debuggierung hinzufügen.

See all articles