Tabelle mit Ordnerstruktur darstellen

Unicate

Erfahrenes Mitglied
Ich habe mir eine Nested Sets Klasse gebaut, die mir folgendes ausgeben kann:
Code:
name		ID	ROOT ID		LFT	RGT	Level	Childs
root		199	199		1	8	1	3	
Kind von 199	261	199		2	3	2	0
Kind von 199	263	199		4	5	2	0
Kind von 199	265	199		6	7	2	0
Jetzt möchte ich das mit bildern darstellen.
Also in etwa so:
root
|-kind1
| `-kind5
| |-kind6
| `-kind7
|-kind2


oder besser so
ich weiß nun nicht wie ich das am günstigsten mache.

Jemand ne idee?
 
Zu Nested Sets (aka modified preorder tree traversal =mptt) gibt es schon einige Beiträge im Forum, die mit dem Suchbegriff mptt zu finden sind, so auch wie man aus einem solchen Result-Set ein mehrdimensionales Array macht, aus dem man rekursiv eine Listendarstellung erstellen kann.

Die gezeigte Darstellung, sollte sich aber auch mit dem erhalten Level und ein paar temporären Variablen lösen lassen, indem Du einfach die entsprechenden Bilder einfügst.

Gruß hpvw
 
Rekursiv mir arrays, halte ich n bissl für zu kompliziert, mal davon abgesehen
mach ich doch die nested sets, um die rekursion zu umgehen....


Man müsste doch anhand der gegebenen Daten, eine sinnvolle anordnung zustand bringen können... irgendwie jedenfalls
 
Unicate hat gesagt.:
Rekursiv mir arrays, halte ich n bissl für zu kompliziert, mal davon abgesehen
mach ich doch die nested sets, um die rekursion zu umgehen....
Vor allem umgeht man durch Nested Sets rekursive und damit häufige Datenbankabfragen. Eine Rekursion in einem PHP-Skript, die nicht bei jedem Aufruf eine DB-Anfrage startet ist längst nicht so zeitkritisch.

Unicate hat gesagt.:
Man müsste doch anhand der gegebenen Daten, eine sinnvolle anordnung zustand bringen können... irgendwie jedenfalls
Du musst Dir ein Array mit den rechten Werten aufbauen, dann ist es verhältnismäßig einfach, eine hierarchische Liste aufzubauen:
PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <meta http-equiv="Content-Type"
        content="application/xhtml+xml; charset=UTF-8" />
    <title>Parsing MPTT</title>
</head>
<body>
<?php

//Beispieldaten
$items = array(
        array('name'=>'Item 1',         'level'=>0, 'lft'=>1,   'rgt'=>22),
        array('name'=>'Item 1.1',       'level'=>1, 'lft'=>2,   'rgt'=>9),
        array('name'=>'Item 1.1.1',     'level'=>2, 'lft'=>3,   'rgt'=>4),
        array('name'=>'Item 1.1.2',     'level'=>2, 'lft'=>5,   'rgt'=>8),
        array('name'=>'Item 1.1.2.1',   'level'=>3, 'lft'=>6,   'rgt'=>7),
        array('name'=>'Item 1.2',       'level'=>1, 'lft'=>10,  'rgt'=>13),
        array('name'=>'Item 1.2.1',     'level'=>2, 'lft'=>11,  'rgt'=>12),
        array('name'=>'Item 1.3',       'level'=>1, 'lft'=>14,  'rgt'=>15),
        array('name'=>'Item 1.4',       'level'=>1, 'lft'=>16,  'rgt'=>17),
        array('name'=>'Item 1.5',       'level'=>1, 'lft'=>18,  'rgt'=>21),
        array('name'=>'Item 1.5.1',     'level'=>2, 'lft'=>19,  'rgt'=>20)
    );
//Ende Beispieldaten

$rgt = array();
echo "<ul>\n";
foreach ($items as $item) {
    echo "<li>".$item['name'];
    if ($item['rgt']>$item['lft']+1) {
        echo "\n<ul>";
        $rgt[] = $item['rgt'];
    } else {
        echo "</li>\n";
        $r = $item['rgt'];
        while (in_array($r+1, $rgt)) {
            $r++;
            echo "</ul></li>\n";
        }
    }
}
echo "</ul>\n";

?>
</body>
</html>
Wenn Du in einer Tabelle jedoch keine hierarchische Struktur aufbaust, sondern nur entsprechend viele Bildchen vor den Titel setzt, wird es komplizierter.
Du musst für jedes Element überprüfen, ob es noch einen "Bruder" zur Rechten gibt. Da dieser auch erst nach diversen Kindern folgen kann, muss das Array mindestens einmal durchlaufen werden, bevor Du mit der Ausgabe beginnst.

Gruß hpvw
 
Zuletzt bearbeitet:
Zurück