Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Rekursive Function

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Rekursive Function

    hallo,

    habe ein problem mit einer rekursiven function - möchte folgendes array durchlaufen und jeweils die kategorien zuordnen - also die pid ist immer die parent kategorie wo das element rein soll. das klappt auch bis zur 2ten ebene - nur danach ist schluss - also "sub kat 3" landet nicht da wo es soll:

    PHP-Code:
    Array
    (
        [
    0] => Array
            (
                [
    cid] => 7
                
    [pid] => 3
                
    [titel] => Sub Kat 3
            
    )

        [
    1] => Array
            (
                [
    cid] => 3
                
    [pid] => 1
                
    [titel] => Sub Kat 1
            
    )

        [
    2] => Array
            (
                [
    cid] => 4
                
    [pid] => 1
                
    [titel] => Sub Kat 1
            
    )

        [
    3] => Array
            (
                [
    cid] => 1
                
    [pid] => 0
                
    [titel] => Kat 1
            
    )

        [
    4] => Array
            (
                [
    cid] => 2
                
    [pid] => 0
                
    [titel] => Kat 2
            
    )

        [
    5] => Array
            (
                [
    cid] => 5
                
    [pid] => 0
                
    [titel] => Kat 3
            
    )

        [
    6] => Array
            (
                [
    cid] => 6
                
    [pid] => 0
                
    [titel] => Kat 4
            
    )

    )

    public function 
    getData($id null) {
            if (
    $id != null)
                
    $this->getDb()->where("pid = $id");
            
            
    $this->getDb()->orderBy("prio,titel""asc");
            
    $res $this->getDb()->get($this->getTable());
            
            
    $data = [];
            foreach (
    $res as $row) {
                if (
    $row['pid'] == 0) {
                    
    $data[$row['cid']]['titel'] = $row['titel'];
                } else {
                    
    $data[$row['pid']]['data'][$row['cid']]['titel'] = $row['titel'];
                }
                
                
    $subArr $this->hasSub($row['cid']);
                if (
    count($subArr) > 0) {
                    
    $this->getData($row['cid']);    
                }
            }
            
            return 
    $data;
        } 


  • #2
    Hallo, den direkten Fehler kann ich jetzt nicht sehen, aber du solltest die Datenbankabfrage raus nehmen aus dieser Funktion, denn so würdest du rekursiv immer wieder Queries an die DB senden. Wenn da ein großer Baum vorliegt und am Ende viele Nutzer da sich durchklicken, kann das hässlich werden was die Performance angeht.

    Das heißt, hole mit einer Query alle Daten aus der Tabelle und schreibe sie in ein Array rein. Dann kannst du dieses, ohne eine weitere DB Abfrage, rekursiv durchlaufen.
    Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
    http://www.lit-web.de

    Kommentar


    • #3
      also die lösung schaut so aus - vielleicht kann es jemand brauchen ...

      PHP-Code:
      public function getData() {
              
      $this->getDb()->orderBy("prio,titel""asc");
              
      $this->_data $this->getDb()->get($this->getTable());
              
              return 
      $this->buildTree($this->_data);
          }
          
          private function 
      buildTree($data$parentId 0) {
              
      $dataArr = [];
              foreach (
      $data as $element) {
                  if (
      $element['pid'] == $parentId) {
                      
      $children $this->buildTree($data$element['cid']);
                      if (
      $children) {
                          
      $element['produkte'] = $children;
                      }
                      
      $dataArr[] = $element;
                  }
              }
          
              return 
      $dataArr;
          } 

      Kommentar

      Lädt...
      X