phpbar.de logo

Mailinglisten-Archive

[php] Rekursive Abfragen für Kategorien

[php] Rekursive Abfragen für Kategorien

A. Sauder andre.sauder at netzwerkcenter.ch
Di Okt 11 20:13:13 CEST 2011


Hallo

Also deine Lösung funktioniert wohl schon auch, nur hast du das Problem 
so bald du
eine Ebene Tiefer rein willst.
Denn das was du machst ist nicht wirklich Rekursiv, sondern mehr 
Verschachtelt.

Hier mal ein ungeprüftes Beispiel einer rekursiven Methode und deren 
Aufruf.

<?PHP

$categoryThree = array();  // initiieren des Array
$categoryThree = getCategorysFromParent($categoryThree, 0, 0);  // 
erster aufruf der rekursiven funktion

// durchlaufen des erzeugten Array mit Mengenkontrolle
if(count($categoryThree) > 0){
     foreach($categoryThree as $k1 => $v1){
         echo '<div 
style="margin-left:'.($v1['lefel']*5).'px;'>'.$v1['kategorie'].'</div>'; 
// ausgabe der Kategorie mit Einrückung
     }
}

/**
  * Liest alle Kategorieen zu einem Parent aus und ergaenzt das 
ThreeArray entsprechend.
  * Die Chield Kategorieen werden direkt unter dem Parent in das Array 
geschrieben
  *
  * $categoryThree = Array mit den bereits vorhandenen Kategorieen
  * $parentId = ID der uebergeortneten Kategorie
  * $level = Ebene auf der sich die auszulesenden Kategoreen befinden
  */
function getCategorysFromParent($categoryThree, $parentId, $level){

     $sql = 'SELECT *
         FROM kategorien
         WHERE id_parent = '.$parentId.'
         ORDER BY id_kategorie ASC';
     $categories = mysql_query($sql , $conDB) or die(mysql_error());
     while ($row = mysql_fetch_array($categories, MYSQL_ASSOC)) {

         $categoryThree[$row['id']] = $row;  // record in den Three 
speichern
         $categoryThree[$row['id']]['level'] = $level;  // level mit 
speichern

         getCategorysFromParent($categoryThree, $row['id_kategorie'], 
$level+1);  // Aufruf der gleichen Methode mit neuer ID und erhöten 
Level
     }
}

?>


Dieses Beispiel könnte dir so etwas raus geben:

Kategorie A
   Kategorie A.A
   Kategorie A.B
Kategorie B
Kategorie C
   Kategorie C.A
   Kategorie C.B
   Kategorie C.C
...

Hoffe konnte dir etwas helfen.

Gruss André

Am 11.10.2011 18:02, schrieb Trawell Mildor:
> Guten Abend zusammen.
>
> hab mich mal mit rekursiven Abfragen beschäftigt..und ja ich 
> weiss..Nestet
> Sets sind sicher besser :)
>
> Also..ich möchte einen Kategorienbaum mit drei Ebenen
>
> und hab dazu folgendes Script gebastelt..so zum Verständnis..und würd 
> gern
> Meinungen von Profis dazu lesen :)
>
> Das Script gibt nur die Kategorien in der entsprechenden Reihenfolge
> aus...also ohne Menü usw.
>
> Ich bin PHP Neuling und über Tips immer aufgeschlossen.
>
> Gruss, Trawell
>
>
> <?php require_once('../Connections/conDB.php'); ?>
> <?php
> mysql_select_db($database_conDB, $conDB);
> ?>
> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "
> http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
> <html xmlns="http://www.w3.org/1999/xhtml">
> <head>
> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
> <title>Unbenanntes Dokument</title>
> </head>
>
> <body>
> <?php
>
> /* Erste Abfrage mit Parent ID = 0 , also Hauptkategorien */
> $query_maincategories = "SELECT * FROM kategorien WHERE id_parent = 0 
> ORDER
> BY id_kategorie ASC";
> $maincategories = mysql_query($query_maincategories, $conDB) or
> die(mysql_error());
> $row_maincategories = mysql_fetch_assoc($maincategories);
> do {
> echo '<h1>'.$row_maincategories['kategorie'].'</h1><br />';
> $zahl = $row_maincategories['id_kategorie'];
>  /* Zweite Abfrage mit Parent ID = aus der ersten Abfrage von 
> id_kategorie
> */
> $query_subcategories = "SELECT * FROM kategorien WHERE id_parent = 
> $zahl
> ORDER BY id_kategorie ASC";
> $subcategories = mysql_query($query_subcategories, $conDB) or
> die(mysql_error());
> $row_subcategories = mysql_fetch_assoc($subcategories);
> do {
> echo '<h2>'.$row_subcategories['kategorie'].'</h2><br />';
> $zahl = $row_subcategories['id_kategorie'];
>  /* Dritte Abfrage mit Parent ID = aus der zweiten Abfrage von 
> id_kategorie
> */
> $query_subsubcategories = "SELECT * FROM kategorien WHERE id_parent = 
> $zahl
> ORDER BY id_kategorie ASC";
> $subsubcategories = mysql_query($query_subsubcategories, $conDB) or
> die(mysql_error());
> $row_subsubcategories = mysql_fetch_assoc($subsubcategories);
> do {
> if (isset($row_subsubcategories['kategorie']))
> {
> echo '<h3>'.$row_subsubcategories['kategorie'].'</h3><br />';
> }
> }
> while ($row_subsubcategories = mysql_fetch_assoc($subsubcategories));
> }
> while ($row_subcategories = mysql_fetch_assoc($subcategories));
> }
> while ($row_maincategories = mysql_fetch_assoc($maincategories));
>
> ?>
> </body>
> </html>
> <?php
> mysql_free_result($maincategories);
> mysql_free_result($subcategories);
> mysql_free_result($subsubcategories);
> ?>


php::bar PHP Wiki   -   Listenarchive