Categorieen

Anubia

Mitglied
Hallo,

ich habe folgendes Problem.
Es existiert eine Datenbank für eine Zuordnung von Kategorien. Nun habe ich vor die Daten in Form eines Verzeichnisbaums auszugeben. Ich habe es zwar geschafft für jede Ebene eine Ausgabe zu erzeugen aber das ist nicht der richtige Weg, denke ich. Die Abfrage müsste rekursiv sein, da die Anzahl der Unterebenen nicht bestimmt ist. Dies bekomme ich leider nicht hin und benötige hierbei Unterstützung.

DB.Tabellen und -struktur, -daten sind vorgegeben.

id = Primary Key
catTitle = Bezeichnung / Name der Kategorie
parentID = Elternkategorie; 0 Entspricht dabei Root Kategorie

Hier ein Beispiel:

id | catTitle | parentID
1 | catTitle 1 | 0
2 | catTitle 2 | 3
3 | catTitle 3 | 2
4 | catTitle 4 | 3
5 | catTitle 5 | 0
6 | catTitle 6 | 5
7 | catTitle 7 | 6
8 | catTitle 8 | 6
-----------------------------

Da die Anzahl der Unterebenen unbestimmt ist muss es irgend eine Logik / Schleife geben, um später die Ausgabe folgender Maßen zu gestalten.

catTitle 1
catTitle 3
catTitle 2
catTitle 4​
catTitle 5
catTitle 6
catTitle 7
catTitle 8​

Die Abfrage sollte möglichst einfach gehalten werden und bitte bedenken, dass die DB Struktur beibehalten werden muss.

Ich freue mich über jede Unterstützung.
 
Es gibt bei deinen Problem mehrere Vorgehensweise,
eine wäre, wenn man mit einer Rekursiven Funktion die Datenbank ausliest und ein Array zusammenbaut.
Aus diesen Array wird mittels einer weiteren Rekursiven Funktion die Ausgabe realisiert.

PHP:
function Readrecursive( $parent_id = 0, $DB ){
    $sql = sprintf( "select * from categories where parentID = %s ", $parent_id );

    $ARR = array( );
    foreach ( $DB ->query( $sql ) as $ROW ) {
        $ARR[$ROW['id']]['id']        = $ROW['id'];
        $ARR[$ROW['id']]['title']    = $ROW['catTitle'];
        $ARR[$ROW['id']]['childs']    = Readrecursive( $ROW['id'], $DB );
    }
   
    return $ARR;
}

function PrintCategories( $ARR ){
    $out = "<ul>";
    foreach ($ARR as $VAL ) {
        $out .= sprintf( "<li>%s</li>", $VAL['title'] );
        if( count( $VAL['childs'] ) > 0 ) {
            $out .= PrintCategories( $VAL['childs'] );
        }
    }

    $out .= "</ul>";
   
    return $out;
}

$DB = new PDO( 'mysql:host=127.0.0.1;port=3306;dbname=test;charset=utf8', 'username', 'password' );

$CATEGORIES = Readrecursive( 0, $DB );

echo PrintCategories( $CATEGORIES );
 

Neue Beiträge

Zurück