| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |
|

04-07-2011, 12:58
|
|
Besth
Registrierter Benutzer
|
|
Registriert seit: Mar 2006
Beiträge: 248
|
|
Baumstruktur ausgeben
Hallo,
ich habe eine Baumstruktur in meiner DB gespeichert und möchte die nun ausgeben. Nur leider scheitert es grad genau hier bei mir.
So soll es am Ende aussehen:
Code:
- Vorgang1
--- Vorgang2
--- Vorgang3
----- Vorgang4
----- Vorgang5
--- Vorgang6
- Vorgang7
--- Vorgang8
- Vorgang9
In meiner Datenbank habe ich immer die zuordnung zum parent gespeichert
Code:
id name parent
1 Vorgang1 0
2 Vorgang2 1
3 Vorgang3 1
[...]
9 Vorgang9 0
Wie muss nun mein php-Code aussehen, um auch möglichst tiefe verschachtelungen auszugeben?
bisher hab ich nur sowas, aber das kann nicht richtig sein, da müsste ich ja jede vertiefung händisch neu programmiern - da gibt es bestimmt ne einfache schleife oder sowas in der art, auf die ich nur nicht komme.
PHP-Code:
$sql = "SELECT * FROM tabelle WHERE parent = '0'"; $result = db($sql); while($row = mysql_fetch_assoc($result)) { echo $row['titel']."<br>"; $sql2 = "SELECT * FROM tabelle WHERE parent = '".$row['id']."'"; $result2 = db($sql2); while($row2 = mysql_fetch_assoc($result2)) { // ausgeben } }
ps: ich weiß das mein db-aufbau um eine baumstruktur abzulegen nicht optimal ist (stichwort: nested sets) nur ist mir alles andere zu kompliziert für meinen kleinen anwendungsfall.
ich will erstmal in dieses thema "reinkommen" - eventuell mach ich mich dann später an andere lösungsmöglichkeiten.
__________________
Mess with the Besth, die like the rest!
|

04-07-2011, 13:08
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Hallo,
nachdem du die gesamte Tabelle abgerufen und in ein Array gespeichert hast, müsstest du dieses mit einer rekursiven Funktion durchlaufen (es geht auch mit Schleifen, ist aber meist komplizierter).
Die Daten in derselben Schleife auszugeben, in der sie abgerufen werden, ist prinzipiell auch möglich, aber nur sinnvoll, wenn die Datensätze entsprechend vorsortiert sind und auch wirklich nur für die Ausgabe benötigt werden. Dafür brauchst du aber einen Stack, der das letzte Element jeder Ebene speichert, damit du, ähnlich zum Verfahren für Gruppenwechsel, den Vergleich mit dem aktuellen Element durchführen kannst, der darüber entscheidet, ob eine Ebenenänderung (ähnlich dem Gruppenbruch) erfolgen muss.
Gruß,
Amica
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

04-07-2011, 13:10
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
|

04-07-2011, 13:37
|
|
Besth
Registrierter Benutzer
|
|
Registriert seit: Mar 2006
Beiträge: 248
|
|
Zitat:
Zitat von AmicaNoctis
nachdem du die gesamte Tabelle abgerufen und in ein Array gespeichert hast, müsstest du dieses mit einer rekursiven Funktion durchlaufen (es geht auch mit Schleifen, ist aber meist komplizierter).
|
Könntest du mir da noch einen Tipp geben wie das Array und die Funktion aussehen müsste?
ich dachte es gibt da etwas einfaches was man genau für solche sachen nimmt
Zitat:
Zitat von h3ll
|
Danke für den sinnfreien Beitrag!
Zitat:
Zitat von Besth
(stichwort: nested sets) nur ist mir alles andere zu kompliziert für meinen kleinen anwendungsfall.
|
__________________
Mess with the Besth, die like the rest!
|

04-07-2011, 13:42
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Zitat:
Zitat von Besth
ich dachte es gibt da etwas einfaches was man genau für solche sachen nimmt
|
Ja, Nested Sets.
|

04-07-2011, 13:49
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Zitat:
Zitat von Besth
Könntest du mir da noch einen Tipp geben wie das Array und die Funktion aussehen müsste?
|
Da gibt es so viele Möglichkeiten. Das Array könnte einfach assoziativ über die ID als Schlüssel gehen, die Funktion hängt unmittelbar davon ab, was du am Ende mit den Daten machen willst: Sie einfach nur ausgeben oder in eine hierarchische Array/Objekt-Struktur überführen?
Man kann auch bereits in der while-Schleife eine hierarchische Struktur aufbauen, entweder mit Objekten oder mit Arrays und Referenzen.
Edit: Thema Nested Sets. Die Hartnäckigkeit von h3ll ist berechtigt, immerhin lässt sich deine DB-Struktur einfach um eine lft- und rgt-Spalte ergänzen, so dass du (unter Aufgabe eines Normalisierungskriteriums) den bisherigen Parent-Children-Ansatz parallel zu Nested Sets fahren kannst.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
Geändert von AmicaNoctis (04-07-2011 um 13:51 Uhr)
|

04-07-2011, 14:46
|
|
Besth
Registrierter Benutzer
|
|
Registriert seit: Mar 2006
Beiträge: 248
|
|
nun gut - danke für den hinweis
ich hab es jetzt so gemacht:
db wird ausgelesen und alles in ein array gepackt
Code:
Array
(
[1] => Array
(
[id] => 1
[parent] => 0
[titel] => test
)
[2] => Array
(
[id] => 2
[parent] => 0
[titel] => titel
)
[3] => Array
(
[id] => 3
[parent] => 1
[titel] => test2
)
[4] => Array
(
[id] => 4
[parent] => 3
[titel] => sdf
)
)
und das wird dann durch folgende funktion gejagt.
PHP-Code:
function list_items($ar,$parent=0){
echo "<br>";
foreach($ar as $key=>$value){
if($value['parent'] == $parent){
echo $value['titel'];
list_items($ar,$value['id']);
}
}
}
list_items($array);
das funzt auch soweit ganz gut.
nur wie rück ich das jetzt ein 
das man erkennt was zu wem gehört - also mit listen oder von mir auch ganz einfachen strichen. nur wo muss der code dafür rein?
ich bin da grad zu doof für - alles was ich bisher versucht hab - klappt nicht ^^
__________________
Mess with the Besth, die like the rest!
|

04-07-2011, 14:52
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Nimm einen dritten Parameter hinzu: $level = 0
Bei jedem rekursiven Aufruf übergibst du dafür $level + 1
Die Einrückung kannst du jetzt anhand von $level vornehmen, dreckiges Beispiel:
PHP-Code:
echo str_repeat(" ", 2 * $level);
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

04-07-2011, 15:18
|
|
Quetschi
PHP Expert
|
|
Registriert seit: Dec 2004
Beiträge: 2.759
|
|
Oder man verschachtelt Listen ineinander und formatiert bequem mit Css.
__________________
Drelingdo
Krabonse
Simmannamando
|

04-07-2011, 15:34
|
|
Besth
Registrierter Benutzer
|
|
Registriert seit: Mar 2006
Beiträge: 248
|
|
ah ja das ist die lösung
ohne das "level" kommt man nicht weiter
danke vielmals.
jetzt funktioniert es
PHP-Code:
function list_items($ar,$parent=0,$level=0){ echo "<br>"; foreach($ar as $key=>$value){ if($value['parent'] == $parent){ echo str_repeat(" ",3*$level).$value['titel']; list_items($ar,$value['id'],$level+1); } } }
list_items($array);
__________________
Mess with the Besth, die like the rest!
Geändert von Besth (04-07-2011 um 16:27 Uhr)
|

04-07-2011, 15:38
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Warum erstellst du keine richtige Liste, wenn du schon eine Liste ausgibst?
|

04-07-2011, 16:06
|
 |
fireweasel
Registrierter Benutzer
|
|
Registriert seit: Sep 2008
Ort: At home
Beiträge: 680
|
|
Zitat:
Zitat von h3ll
Warum erstellst du keine richtige Liste, wenn du schon eine Liste ausgibst?
|
Die Best(h)en, der Besten, der Besten kommen halt ohne so einen unnützen Kram wie semantisches Markup aus.
__________________
PHP-Code:
class Brick implements Throwable {
// ...
}
|

04-07-2011, 16:27
|
|
Besth
Registrierter Benutzer
|
|
Registriert seit: Mar 2006
Beiträge: 248
|
|
darum gehts doch garnicht
das mein code am ende nicht so aussehen wird, sollte klar sein
aber zu testzwecken und um mein problem darzulegen fand ich es passend.
aber schön das ihr auch mal euren senf abgelassen habt. ich denke ich habe mein anliegen gut geschildert und habe auch geschrieben was ich schon unternommen habe und was ich nicht möchte. und dennoch kommen dann so sinnlose beiträge ...
nunja wie auch immer
Ich danke noch einmal AmicaNoctis für die konstruktiven Lösungsvorschläge.
Das hat mir sehr weitergeholfen
__________________
Mess with the Besth, die like the rest!
|

04-07-2011, 16:34
|
|
Quetschi
PHP Expert
|
|
Registriert seit: Dec 2004
Beiträge: 2.759
|
|
Du hast nach einer Möglichkeit zur Einrückung gefragt und dir wurde nach der ersten Antwort eine weitere Möglichkeit genannt. Wenn du weiterhin nur den erstbesten Vorschlag brauchst, erspare ich (und wohl auch ein paar andere) es mir, dir (sinnvolle) Alternativen aufzuzeigen.
__________________
Drelingdo
Krabonse
Simmannamando
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|