php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


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! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 04-07-2011, 12:58
Besth
 Registrierter Benutzer
Links : Onlinestatus : Besth ist offline
Registriert seit: Mar 2006
Beiträge: 249
Besth ist zur Zeit noch ein unbeschriebenes Blatt
Standard 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!
Mit Zitat antworten
  #2 (permalink)  
Alt 04-07-2011, 13:08
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

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!
Mit Zitat antworten
  #3 (permalink)  
Alt 04-07-2011, 13:10
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.578
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Nested Sets ? Wikipedia
Mit Zitat antworten
  #4 (permalink)  
Alt 04-07-2011, 13:22
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

Evtl ist dir dieses ja eine Hilfe: PHP: RecursiveTreeIterator - Manual
__________________
Wir werden alle sterben
Mit Zitat antworten
  #5 (permalink)  
Alt 04-07-2011, 13:37
Besth
 Registrierter Benutzer
Links : Onlinestatus : Besth ist offline
Registriert seit: Mar 2006
Beiträge: 249
Besth ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von AmicaNoctis Beitrag anzeigen
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 Beitrag anzeigen
Danke für den sinnfreien Beitrag!
Zitat:
Zitat von Besth Beitrag anzeigen
(stichwort: nested sets) nur ist mir alles andere zu kompliziert für meinen kleinen anwendungsfall.
__________________
Mess with the Besth, die like the rest!
Mit Zitat antworten
  #6 (permalink)  
Alt 04-07-2011, 13:42
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.578
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Besth Beitrag anzeigen
ich dachte es gibt da etwas einfaches was man genau für solche sachen nimmt
Ja, Nested Sets.
Mit Zitat antworten
  #7 (permalink)  
Alt 04-07-2011, 13:49
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von Besth Beitrag anzeigen
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)
Mit Zitat antworten
  #8 (permalink)  
Alt 04-07-2011, 14:46
Besth
 Registrierter Benutzer
Links : Onlinestatus : Besth ist offline
Registriert seit: Mar 2006
Beiträge: 249
Besth ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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!
Mit Zitat antworten
  #9 (permalink)  
Alt 04-07-2011, 14:52
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

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("&#xa0;"$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!
Mit Zitat antworten
  #10 (permalink)  
Alt 04-07-2011, 15:18
Quetschi
 PHP Expert
Links : Onlinestatus : Quetschi ist offline
Registriert seit: Dec 2004
Beiträge: 3.134
Quetschi wird schon bald berühmt werden
Standard

Oder man verschachtelt Listen ineinander und formatiert bequem mit Css.
__________________
Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
Schön - etwas Geschichte kann ja nicht schaden.
Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!
Mit Zitat antworten
  #11 (permalink)  
Alt 04-07-2011, 15:34
Besth
 Registrierter Benutzer
Links : Onlinestatus : Besth ist offline
Registriert seit: Mar 2006
Beiträge: 249
Besth ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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("&nbsp;",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)
Mit Zitat antworten
  #12 (permalink)  
Alt 04-07-2011, 15:38
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.578
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Warum erstellst du keine richtige Liste, wenn du schon eine Liste ausgibst?
Mit Zitat antworten
  #13 (permalink)  
Alt 04-07-2011, 16:06
Benutzerbild von fireweasel fireweasel
 Registrierter Benutzer
Links : Onlinestatus : fireweasel ist offline
Registriert seit: Sep 2008
Ort: At home
Beiträge: 851
fireweasel wird schon bald berühmt werdenfireweasel wird schon bald berühmt werden
fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken
Standard

Zitat:
Zitat von h3ll Beitrag anzeigen
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.
Mit Zitat antworten
  #14 (permalink)  
Alt 04-07-2011, 16:27
Besth
 Registrierter Benutzer
Links : Onlinestatus : Besth ist offline
Registriert seit: Mar 2006
Beiträge: 249
Besth ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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!
Mit Zitat antworten
  #15 (permalink)  
Alt 04-07-2011, 16:34
Quetschi
 PHP Expert
Links : Onlinestatus : Quetschi ist offline
Registriert seit: Dec 2004
Beiträge: 3.134
Quetschi wird schon bald berühmt werden
Standard

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.
__________________
Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
Schön - etwas Geschichte kann ja nicht schaden.
Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Baumstruktur in SQL-DB speichern? TriphunEM PHP Developer Forum 3 05-03-2005 15:52
Baumstruktur boonkerz Apps und PHP Script Gesuche 9 24-02-2004 22:34
Baumstruktur Webbi PHP Developer Forum 9 23-07-2003 15:13
Baumstruktur ? flo PHP Developer Forum 5 18-10-2002 23:38
Forum mit Baumstruktur moorhuehnchen PHP Developer Forum 2 09-09-2001 20:05

Themen-Optionen
Thema bewerten
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.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 03:12 Uhr.