rekursives sortieren Version 1

für die Erstellung eines Menüs mit Nummierung

Beispiel einer rekursive Abfrage einer Datenbank um ein Menü aufzubauen und die Ausgabe mit Nummierung zu bekommen

Beispiel: Datenbank id - parent_id -title

class Node
{  var $nParent;
   var $strName;
   var $arrChapter;
   var $arrChild;
   public function __construct($__nParent,$__strName)
   {  $this->nParent =$__nParent;
      $this->strName =$__strName;
      $this->arrChild=array();
      $this->arrChapter  =array();
   }
   public function addChild($__oNode)
   {  array_push($this->arrChild,$__oNode);
   }
}
 
// SQL Abfrage erstellen
if ($published) {
	$where = ' WHERE published = 1';
} else {
	$where = '';
}
 
$query = 'SELECT *, id AS value, title AS text'
		.' FROM #__quickfaq_categories'
		.$where
		.' ORDER BY parent_id, ordering';
 
// Datenbank Abfrage
$db    =& JFactory::getDBO();	
		  $db->setQuery($query);
$result = $db->loadObjectList();
 
// Felder auslesen und einem Array zuweisen
foreach ($result as $row) {
  $arrItem[$row->id] = array(
		'0' => $row->id,
        '1' => $row->parent_id,
        '2' => $row->title
        );
}
 
$arrNode=array();
foreach($arrItem as $arrData)
   $arrNode[$arrData[0]]=new Node($arrData[1],$arrData[2]);
 
// Baumstruktur aufbauen:
foreach($arrNode as $nI => $oNode)
   if(($nParent=$oNode->nParent)>0)
      $arrNode[$nParent]->addChild($oNode);
 
function cap($__oNode,$__arrChapter,&$__arrResult)
{ 
   // Rekursiv alle Elemente durchlaufen:
   array_push($__arrResult,array(implode('.',$__oNode->arrChapter),$__oNode->strName));
   $nCap=1;
   foreach($__oNode->arrChild as $oNode)
   {  $oNode->arrChapter=array_merge($__arrChapter,array($nCap));
      cap($oNode,$oNode->arrChapter,$__arrResult);
      ++$nCap;
   }
}
 
// Root-Elemente:
$arrResult=array();
$nCap=1;
foreach($arrNode as $oNode)
   if($oNode->nParent==0)
   {  $oNode->arrChapter[0]=$nCap;
      cap($oNode,$oNode->arrChapter,$arrResult);
      ++$nCap;
   }
 
// Aufbau für MooTree
for ($i=0; $i < count($arrResult); $i++){
	echo $arrResult[$i][0]; //  zweites Array ist 0=Nr 1=Name
	echo $arrResult[$i][1]; //  zweites Array ist 0=Nr 1=Name
	echo "<br>";
}