Ankündigung

Einklappen
Keine Ankündigung bisher.

Pfad zurückverfolgen und strukturieren

Einklappen

Neue Werbung 2019

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

  • Pfad zurückverfolgen und strukturieren

    Hallo zusammen.

    Ich greife in meinen PHP Script auf eine Ordnerstruktur zu. Diese ist wie folgt aufgebaut:

    folder_id | name | path
    --------------------------
    1 | Test | 0 => root
    2 | Test2 | 1 => sub-ordner von 1
    3 | Test3 | 0 => root
    4 | Test4 | 1 => sub-ordner von 1
    5 | Test5 | 4 => sub-ordner von 4

    als path ist immer der nächste Ordner darüber angegeben. Somit kann ich einfach den ganzen Pfad zurückverfolgen.

    Nun möchte ich alle Ordner in struktiererter Reihenfolge anzeigen. Dies sollte in etwas so aussehen:

    - Test
    -- Test2
    -- Test4
    --- Test5
    -Test3

    Ich habe bereits einige Versuche gemacht, die mich aber nicht gross weitergebracht haben...

    PHP-Code:
    // hole Daten
    while($row mysql_fetch_row($query_gfl)) {
        
    $arr_gfl[$row[0]] = $row[1]; // schaffe erste Struktur
    }

    // Versuch einer Strukturierung
    $ret "";
    foreach(
    $arr_gfl as $k_gf => $gf) {
        if(!
    in_array($k_gf$arr_gfl)) { // Ordner ohne subordner
            
    $ret .= $k_gf "<br />";
        }
        else { 
    // Ordner mit subordner...
            
    $ret .= "- " $k_gf "<br />";
        }

    Habe in diesem Fall probiert die Ordner, die einen unterordner haben anzusprechen.
    Nun müsste ich eigentlich nur noch herausfinden, welche subfolder das sind und wieviele weitere es gibt.
    Dies bereitet mir jedoch schwierigkeiten, da ich ja im foreach() jeden Ordner durcharbeite!?

    Nun, gibt es while() oder andere Möglichkeiten, die mein Problem einfacher realisierbar machen oder habe ich einen einfachen denkfehler in meiner Programmierung gemacht?

    Vielen Dank
    Gruss Toby
    codestyle.ch
    ----------------------------

  • #2
    Damit du unendlich tief zugreifen kannst, könntest du eine Rekursion verwenden.
    denke da findest du hier und bei google genug zu.. wenn nicht, schreien!

    Kommentar


    • #3
      Vielen Dank für den Tip!

      Hmm, da muss ich mich wohl auch Mal noch kräftiger reinarbeiten ^^

      Hier das erste Resultat:

      PHP-Code:
      function folderlist($parent) {
          global 
      $db;
          
          if(
      $parent != 0$where "`folder_id` = $parent";
          else 
      $where "";
          
          
      // get folder list
          
      $sql_gfl $db->dbselect(
              
      "`folder_id`,
              `name`,
              `path`"
      ,
              
      "`upload_folder`",
              
      "$where"
          
      );
          
          
      $query_gfl $db->dbquery($sql_gfl);
          
          
      $ret "";
          while(
      $folder mysql_fetch_assoc($query_gfl)) {
              if(
      $folder["path"] != 0) {
                  
      $ret .= "- " $folder["name"] . "<br />";
                  
      $ret .= "- " folderlist($folder["path"]);
              }
              else {
                  
      $ret .= "- " $folder["name"] . "<br />";
              }
          }
          
          return 
      $ret;

      Nun sind die Einträge noch in der falschen Reihenfolge und werden auch mehrmals angezeigt...

      Krieg ich aber vielleicht sogar alleine hin ^.^
      Bin aber immer froh um eure hilfreichen Tips, wenn wirklich gerade etwas total blödes im Code versteckt ist xD

      Danke, Gruss Toby
      codestyle.ch
      ----------------------------

      Kommentar


      • #4
        Muss jetzt zwar los zur Arbeit, aber auf den ersten Blick fällt mir auf:

        PHP-Code:
         if($parent != 0$where "`folder_id` = $parent";
            else 
        $where ""

        wenn keine ParentId vorhanden ist bzw. du die erste Ebene auslesen möchtest, musst du natürlich auch ParentId=0 setzen, damit du nur die ERSTE Ebene ausgibst, und nicht direkt alle Datensätze

        Schönen Abend noch

        PS: Meiner Erfahrung nach, entstehen bei den ersten Rekursions-Versuchen oft Endlosschleifen, also auf der Hut sein oder die Schleifendurchgänge mitzählen und ab einer gewissen Anzahl von Durchläufen einfach die Schleife verlassen (siehe break, continue,...)

        Kommentar


        • #5
          Du könntest - was Du ja wohl auch schon versucht hast - 2-stufig arbeiten.
          Sprich im ersten Schritt aus den "flachen" Daten ein mehrdimensionales Array bauen. Dank der "Parent-ID" brauchst Du dafür auch keine Rekursion.

          PHP-Code:
          $raw = array(array('id'=>1,'name'=>'Test','parent'=>0),array('id'=>2,'name'=>'Test2','parent'=>1),array('id'=>3,'name'=>'Test3','parent'=>0),array('id'=>4,'name'=>'Test4','parent'=>1),array('id'=>5,'name'=>'Test5','parent'=>4),array('id'=>6,'name'=>'Test6','parent'=>3),array('id'=>7,'name'=>'Test7','parent'=>6));

          $items = array();

          foreach(
          $raw as $val){
              
          $items[$val['id']] =  $val;
              
          $items[$val['parent']][$val['id']] =& $items[$val['id']];
          }
          echo 
          '<pre>';
          print_r($items[0]);
          echo 
          "</pre>"
          Dieses Array kannst Du dann leichter verarbeiten z.B. in einen ASCII-Baum, UL oder was auch immer.

          PHP-Code:
          $it = new RecursiveTreeIterator( new RecursiveArrayIterator$items[0] ) );
          foreach( 
          $it as $o ){
              if(
          $it->key() == 'name'){
                  echo 
          '<pre>';
                  
          print_r($o);
                  echo 
          "</pre>";
              }
           } 
          AFFE ist nur im Dezimalsystem ein Palindrom.

          Kommentar


          • #6
            Vielen Dank..

            Ich werde trotz allem die Rekursive Methode verwenden, da ich da noch verstehe, was ich überhaupt programmiere ^.^

            Also habe nun folgenden Stand:

            PHP-Code:
            function folderlist($parent = -1) {
                global 
            $db;
                
                
            /*if($parent != 0) $where = "`folder_id` = $parent";
                else $where = "";*/
                
                
            if($parent == -1$where ""// -1 = show all, 0 = show root
                
            else $where "`path` = $parent";
                
                
            // get folder list
                
            $sql_gfl $db->dbselect(
                    
            "`folder_id`,
                    `name`,
                    `path`"
            ,
                    
            "`upload_folder`",
                    
            "$where"
                
            );
                
                
            $query_gfl $db->dbquery($sql_gfl);
                
                
            $ret "";
                while(
            $folder mysql_fetch_assoc($query_gfl)) {
                    if(
            $folder["path"] != 0) {
                        
            $ret .= "-- " $folder["name"] . "<br />";
                        
            $ret .= "" folderlist($folder["folder_id"]) . "";
                        
            //$ret .= "</ul></li>";
                    
            }
                    else {
                        
            $ret .= "- " $folder["name"] . "<br />";
                    }
                }
                
            $ret .= "</ul>";
                
                return 
            $ret;

            Bei angabe von -1 sollen alle Einträge aufgelistet werden, bei 0 root usw.

            Es Funktioniert zwar soweit nicht schlecht nur
            - einige Ordner werden Mehrmals aufgelistet
            - ich verstehe die Verteilung der Menge von "-" vor dem Eintrag noch nicht.

            Zum zweiten Punkt:
            Die Verteilung soll so sein, dass je jeder weitere Unterordner ein weiterer "-" bekommt. (Siehe mein erster Post)

            Danke für eure Hilfe und Geduld mit mir >.<
            Gruss Toby

            EDIT ---------------------------------------------

            Okay, da hab ich auch schwachsinn gemacht, hier xD
            Also mein aktueller Stand ist, dass jetzt die Richtigen Ordner angezeigt werden, ich aber mit den Strichen noch Probleme habe.

            Was ich noch muss; Die Striche, die weggenommen werden (also - $x) stimmen nicht.

            Hier der Code:

            PHP-Code:
            function folderlist($parent 0$x 0) {
                global 
            $db;
                
                
            /*if($parent != 0) $where = "`folder_id` = $parent";
                else $where = "";*/
                
                
            $where "`path` = $parent";
                
            $where_b "`folder_id` = $parent"// before
                
                // get folder list
                
            $sql_gfl $db->dbselect(
                    
            "`folder_id`,
                    `name`,
                    `path`"
            ,
                    
            "`upload_folder`",
                    
            "$where"
                
            );
                
            $query_gfl $db->dbquery($sql_gfl);
                
                
            $sql_bef $db->dbselect(
                    
            "`folder_id`,
                    `name`,
                    `path`"
            ,
                    
            "`upload_folder`",
                    
            "$where_b"
                
            );
                
            $query_bef $db->dbquery($sql_bef);
                
                
            $before mysql_fetch_assoc($query_bef);
                
            //print_r($before);
                
                
            $ret "";
                while(
            $folder mysql_fetch_assoc($query_gfl)) { // wenn keine Childs mehr übrig sind, ist nichts mehr im while ^^
                    
                    
            $foid $folder["folder_id"];
                    
            $fona $folder["name"];
                    
            $fopa $folder["path"];
                    
                    if(
            $fopa != $before["folder_id"]) {
                        
            $x++;
                    }
                    
                    
            //$ret .= $x;
                    
                    
            $tz "";
                    for(
            $y $x$y 0$y--) {
                        
            $tz .= "-";
                    }
                    
                    
            $ret .= $tz $fona "<br />";
                    
                    
            $ret .= "" folderlist($foid$x);
                    
                }
                
            $ret .= "</ul>";
                
                return 
            $ret;

            codestyle.ch
            ----------------------------

            Kommentar

            Lädt...
            X