dateisortierung

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

  • dateisortierung

    liebe php community,

    ich verwende folgendes script für das einlesen von dateinamen von php datein aus einem verzeichniss in eine linkliste. ich mochte die datein aber auch noch alphabetisch oder numerisch ordnen bevor sie aufgelistet werden. dazu bräuchte ich eure hilfe, wenn sich jemand auskennt, bitte postet mir den code mit der gesuchten erweiterung!

    vielen dank,
    limate

    PHP-Code:
    <?php
    // Öffnet ein Unterverzeichnis mit dem Namen "daten"
    $verzeichnis openDir("daten");
    // Verzeichnis lesen
    while ($file readDir($verzeichnis)) {
    // Höhere Verzeichnisse nicht anzeigen!
     
    if ($file != "." && $file != "..") {
      
    // Dateityp filtern. Es werden nur .php-Dateien angezeigt
      
    if (strstr($file".php")) {
       
    // Dateiendung vom Dateinamen filtern
       
    $name explode("."$file);
       
    // Link erstellen
       
    echo "<a href=\"$file\">$name[0]</a><br>\n";
      }
     }
    }
    closeDir($verzeichnis); // Verzeichnis schließen
    ?>

  • #2
    Schreibe die Dateien in der Schleife nicht sofort raus, sondern sammle sie in einem Array.
    Sortiere dieses anschließend (siehe Manual, Array-Funktionen) - und durchlaufe es dann in einer weiteren Schleife (foreach), um die Ausgabe der einzelnen Elemente zu machen.

    Solltest du dich zu irgendeinem dieser Punkte gleich veranlasst fühlen „aber ich weiß nicht, wie sowas geht“ zu antworten - dann arbeite bitte zunächst ein Grundlagen-Tutorial durch.
    I don't believe in rebirth. Actually, I never did in my whole lives.

    Kommentar


    • #3
      glob() sortiert automatisch
      Wir werden alle sterben

      Kommentar


      • #4
        Die Funktion glob() bringt aber auch so ihre Eigenheiten mit sich und läuft nicht immer einwandfrei. Ich würde eher das DirectoryIterator Objekt aus der SPL empfehlen. Arbeitet schneller und sauberer als glob() und bringt 'ne Menge Methoden mit sich, um die Ergebnisse nochmals zu bearbeiten. Das Auslesen sollte hier wie bei glob() auch alphabetisch erfolgen.
        MM Newmedia | MeinBlog

        Kommentar


        • #5
          Die Funktion glob() bringt aber auch so ihre Eigenheiten mit sich und läuft nicht immer einwandfrei.
          Aha!
          Welche Sorgen erwartest du, bei dem Problem hier?

          Da hier sortiert werden muss, sind die Directory Iteratoren schlecht geeignet. Denn das können sie nicht leisten.
          Wir werden alle sterben

          Kommentar


          • #6
            Zitat von combie Beitrag anzeigen
            Aha!
            Welche Sorgen erwartest du, bei dem Problem hier?

            Da hier sortiert werden muss, sind die Directory Iteratoren schlecht geeignet. Denn das können sie nicht leisten.
            Ich hatte vor einiger Zeit diverse Probleme mit glob() und habe das mal zusammengefasst: glob() ist gar nicht so toll, wie alle sagen | Der Entwickler Blog von MM Newmedia

            Gut, Du hast Recht. Die Iteratoren bringen keinerlei Sortierung mit sich. Dennoch kann man dann auf den Ansatz von Wahsaga zurückgreifen und entsprechende Array funktionen benutzen.

            Ich würde es nach folgendem Beispiel umsetzen:
            PHP-Code:
            $files = new ArrayObject();
            foreach (new 
            DirectoryIterator(dirname(__FILE__)) as $file) {
                
            $files[] = $file->getFilename();
            }

            $files->natsort();

            echo 
            "<pre>";
            print_r($files);
            echo 
            "</pre>"
            MM Newmedia | MeinBlog

            Kommentar


            • #7
              Zitat von combie Beitrag anzeigen
              glob() sortiert automatisch
              Das kann scandir() auch, nebenbei kann es mit Streamwrappern umgehen. Glob() kann das nicht.

              Wenn es ums Sortieren geht, würde ich immer eine Lösung bevorzugen, die eine Datenstruktur zurückgibt, die man in PHP selbst sortieren kann. Also bspw. ein PHP-Array. Denn Sortieren muss nicht immer in der "ASCII-betischen" Reihenfolge gewünscht sein. Usort() gemeinsam mit einer der vielen String-Vergleichsfunktionen oder einer selbstgeschriebenen ist flexibler als die in glob() eingebaute "Sortier"-Reihenfolge.

              Zitat von combie Beitrag anzeigen
              Welche Sorgen erwartest du, bei dem Problem hier?
              Zitat von limate;
              ich mochte die datein aber auch noch alphabetisch oder numerisch ordnen ...
              Glob() kann aber nur auf (s)eine Art sortieren.

              Zitat von combie Beitrag anzeigen
              Da hier sortiert werden muss, sind die Directory Iteratoren schlecht geeignet. Denn das können sie nicht leisten.
              Mir scheint, sie können überhaupt sehr wenig leisten.

              PHP-Code:
              // sortiert, filtert, map(p)t, "faltet" die Einträge eines
              // Verzeichnisses
              class xdir {
                  function 
              __construct($uri NULL) {
                      
              $this->_dirlist $this->_scan($uri);
                  }

                  function 
              _scan($uri) {
                      if (!
              is_resource($dir opendir($uri))) {
                          return 
              NULL;
                      }
                      while (
              is_string($entry readdir($dir))) {
                          if (
              '..' === $entry || '.' === $entry) {
                              continue;
                          }
                          
              $list[] = $entry;
                      }
                      
              closedir($dir);
                      return 
              $list;
                  }

                  
              // wenn keine Kopien gewuenscht sind, 
                  // kann das hier auch entfernt werden ...
                  /// create a new xdir object from a given PHP array
                  /// return object
                  
              static function cloneme($list) {
                      
              $xdir = new self();
                      
              $xdir->_dirlist is_array($list) ? $list : (array) $list;
                      return 
              $xdir;
                  }

                  
              /// apply a map function
                  /// return object
                  
              function map($mapfunc) {
                      if (!
              is_callable($mapfunc)) {
                          return 
              NULL;
                      }
                      
              // note: array_map($callback, $array) has reversed arguments
                      
              return self::cloneme(array_map($mapfunc$this->_dirlist));
                  }

                  
              /// apply a PCRE onto every entry
                  /// return object
                  
              function grep($pcre$invert FALSE) {
                      if (!
              is_int(@preg_match($pcre''))) {
                          return 
              NULL;
                      }
                      return 
              self::cloneme(preg_grep($pcre$this->_dirlist, (bool) $invert));
                  }

                  
              /// apply a filter function
                  /// return object
                  
              function filter($filterfunc) {
                      if (!
              is_callable($filterfunc)) {
                          return 
              NULL;
                      }
                      return 
              self::cloneme(array_filter($this->_dirlist$filterfunc));
                  }

                  
              /// do a (left-)fold
                  /// return misc (depending on the type returned by the fold function)
                  
              function fold($foldfunc$init NULL) {
                      if (!
              is_callable($foldfunc)) {
                          return 
              NULL;
                      }
                      
              /// $foldfunc($init, $list_entry)
                      
              return array_reduce($this->_dirlist$foldfunc$init);
                  }

                  
              /// sort
                  /// return object
                  
              function sort($cmpfunc 'strcmp') {
                      if (!
              is_callable($cmpfunc)) {
                          return 
              NULL;
                      }
                      
              $clone self::cloneme($this->_dirlist);
                      
              usort($clone->_dirlist$cmpfunc);
                      return 
              $clone;
                  }

              Anwendungsbeispiele:

              PHP-Code:
              $uri dirname(__FILE__);
              $dir = new xdir($uri);

              // simple grep-filter:
              var_dump($dir->grep('/\.php\z/'));

              // simple reverse sort:

              var_dump(
                  
              $dir->sort(create_function(
                      
              '$a, $b',
                      
              'return !strcmp($a, $b);'
                  
              ))
              );

              // Ausgabe als HTML:

              $foldfunc create_function(
                  
              '$html, $entry',
                  
              'return $html .= sprintf(
                      "<tr><td>%s</td></tr>\r\n",
                      htmlspecialchars($entry)
                  );'
              );

              $html "<table>\r\n";
              $html $dir->fold($foldfunc$html);
              $html .= "</table>\r\n";
              echo 
              $html
              Extra-Behandlung von Verzeichnissen und Unterverzeichnissen und eine ausgefeiltere Fehlerbehandlung überlasse ich dem interessierten PHP-Bastler als Hausaufgabe.
              Zuletzt geändert von fireweasel; 17.09.2010, 21:29.
              Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

              Kommentar

              Lädt...
              X