net-zwerg: sortierte Dateien

Hallo alle miteinander.

Ich habe neulich ein ziemlcih einfaches PHP-Skript geschrieben, das ein Verzeichnis auf meinem Webserver (Apache auf SuSE Linux) ausließt,

$basis = "/usr/local/httpd/htdocs/doc/dateien/";
$fd = dir($basis);
while($v = $fd->read() ) {
 $arr[]=$v;
}
$fd->close();

und mir die Die Dateien als Verlinkung darstellt.

foreach ($arr as $elem) {
 if (($elem!=='..') and ($elem!='.')){
   $name=str_replace(".doc","",$elem);
   $name=str_replace("_"," ",$name);
   echo"<option value='doc/dateien/$elem'>$name";
  }
}

Jetzt verstehe ich nur nicht, nach welchem Schema der ganze Kram sortiert ist??? Das wird weder nach Erstellungsdatum (was ich nämlich eigentlich will) noch alphbetisch noch sontirgendwie sortiert.

Ich brauche das unbedingt sortiert. Leider komme ich mit asort(&arr) nicht weiter, da die Dateinamen nicht besonders geshcickt zu ordnen sind. (die heißen 1.Januar_2001.doc, 3.Februar_2002.doc...usw) Die einzige Möglichkeit ist, die nach Erstellungsdatum geordnet auszugeben.

Weiß da jemand weiter

Danke

Net-Zwerg
---------
*linux is like a wigwam - no gates, no windows and an apache inside*

  1. Hoi,

    Ich habe neulich ein ziemlcih einfaches PHP-Skript geschrieben,
    das ein Verzeichnis auf meinem Webserver (Apache auf SuSE Linux)
    ausließt,

    [...]

    Jetzt verstehe ich nur nicht, nach welchem Schema der ganze Kram
    sortiert ist??? Das wird weder nach Erstellungsdatum (was ich
    nämlich eigentlich will) noch alphbetisch noch sontirgendwie
    sortiert.

    Gar nicht. Die Reihenfolge duerfte sich nach der Reihenfolge in
    der Datei-Zuordnungs-Tabelle richten.

    Ich brauche das unbedingt sortiert. Leider komme ich mit
    asort(&arr) nicht weiter, da die Dateinamen nicht besonders
    geshcickt zu ordnen sind. (die heißen 1.Januar_2001.doc,
    3.Februar_2002.doc...usw) Die einzige Möglichkeit ist, die nach
    Erstellungsdatum geordnet auszugeben.

    Nun, das geht recht einfach mit usort:

    $array = usort($array,"mycmp");

    function mycmp($a,$b) {
     $date1 = stat($a);
     $date2 = stat($b);

    if ($a[9] == $b[9]) return 0;
     return ($a[9] > $b[9]) ? -1 : 1;
    }

    Du kannst allerdings nicht nach dem Erstellungs-Datum, sondern
    nur nach den Informationen ordnen, die stat() dir gibt.
    Siehe dazu auch http://php.net/stat.

    Gruesse,
     CK

    1. Hoi,

      Ich habe neulich ein ziemlcih einfaches PHP-Skript geschrieben,
      das ein Verzeichnis auf meinem Webserver (Apache auf SuSE Linux)
      ausließt,

      [...]

      Jetzt verstehe ich nur nicht, nach welchem Schema der ganze Kram
      sortiert ist??? Das wird weder nach Erstellungsdatum (was ich
      nämlich eigentlich will) noch alphbetisch noch sontirgendwie
      sortiert.

      Gar nicht. Die Reihenfolge duerfte sich nach der Reihenfolge in
      der Datei-Zuordnungs-Tabelle richten.

      ahhh so... das ist natürlich auch irgendwie logisch....

      Nun, das geht recht einfach mit usort:

      $array = usort($array,"mycmp");

      function mycmp($a,$b) {
      $date1 = stat($a);
      $date2 = stat($b);

      if ($a[9] == $b[9]) return 0;
      return ($a[9] > $b[9]) ? -1 : 1;
      }

      Du kannst allerdings nicht nach dem Erstellungs-Datum, sondern
      nur nach den Informationen ordnen, die stat() dir gibt.
      Siehe dazu auch http://php.net/stat.

      Ja, vielen Dank, aber irgendwie ist das zu hoch für mich.... ich verstehe das skript irgendwie nicht...
      Also usort ist klar....stat mittlerweile auch....aber irgendwie ist mir die funktionsweise nicht so ganz klar...wie bekomme ich denn mein Array damit geordnet....

      Gruß

      zwerg-in-quest

      1. Hoi, <-- sowas nennt man eine Begruessung

        lies mal http://learn.to/quote

        ahhh so... das ist natürlich auch irgendwie logisch....

        Nun, Tatsache ist, dass die Reihenfolge nicht definiert ist.

        Nun, das geht recht einfach mit usort:

        $array = usort($array,"mycmp");

        function mycmp($a,$b) {
        $date1 = stat($a);
        $date2 = stat($b);

        if ($a[9] == $b[9]) return 0;
        return ($a[9] > $b[9]) ? -1 : 1;
        }

        Du kannst allerdings nicht nach dem Erstellungs-Datum, sondern
        nur nach den Informationen ordnen, die stat() dir gibt.
        Siehe dazu auch http://php.net/stat.

        Ja, vielen Dank, aber irgendwie ist das zu hoch für mich....
        ich verstehe das skript irgendwie nicht...
        Also usort ist klar....stat mittlerweile auch....aber irgendwie
        ist mir die funktionsweise nicht so ganz klar...wie bekomme ich
        denn mein Array damit geordnet....

        Die Funktion wird im zweiten Parameter an 'usort' uebergeben.
        Usort ruft fuer jedes Elemente-Paar diese Funktion auf und uebergibt
        ein Elemente-Paar aus dem Array. Die Funktions-Argumente $a und $b
        repraesentieren diese beiden Elemente. Jetzt wird geschaut, ob die
        letzte Zugriffszeit auf diese Elemente gleich ist, in dem Fall wird
        0 zurueck gegeben. Ist die von Element a groesser (== juenger),
        dann wird 1 zurueck gegeben. Ansonsten ist die Zugriffszeit von
        Element b juenger, und es wird -1 zurueck gegeben. Anhand der
        Rueckgabewerte kann usort dann entscheiden, wohin ein Element
        gehoert.

        Gruesse,
         CK

        1. Vielen Dank! Jetzt habe ich es irgendwie auch kapiert. Nur klappt das ganze immer noch nicht.

          Mein erster Fehler war, das das Skript den Dateinamen ausgelesen hat, die Funktion allerdings auch den Pfad brauchte.
          MIttlerweile habe ich das behoben, aber ich habe ein noch größeres Problem:

          mein Array ist nach dem usort kein array mehr

          echo "TEMParr:$TEMParr<br>";
          $TEMParr = usort($TEMParr,'mycmp');
          echo "TEMParr:$TEMParr<br>";

          gibt folgendes aus:

          TEMParr:Array
          TEMParr:1

          ich habe mittlerweile die Funktion denkbar einfachst umgestrickt, was aber nichts geholfen hat:

          1 function mycmp($a,$b) {
          2  global $TEMPbasis;
          3
          4   $date1 = stat($TEMPbasis.'/'.$a);
          5   $date2 = stat($TEMPbasis.'/'.$b);
          6
          7  echo $date1[9] ."-". $date2[9]."<br>";
          8
          9   if ($date1[9] == $date2[9]) return 0;
          10   if ($date1[9] < $date2[9])  return 1;
          11   return -1;
          12 }

          Zeile 2 gibt mir den Pfad zur Datei.
          Die Ausgabe in Zeile  7 liefert den timestamp der Dateien.

          Warum ist am ende mein Array kein Array mehr ???

          Gruß

          Zwerg

          Gruesse,
          CK

          1. Hoi,

            Mein erster Fehler war, das das Skript den Dateinamen ausgelesen
            hat, die Funktion allerdings auch den Pfad brauchte.
            MIttlerweile habe ich das behoben, aber ich habe ein noch
            größeres Problem:

            mein Array ist nach dem usort kein array mehr

            echo "TEMParr:$TEMParr<br>";
            $TEMParr = usort($TEMParr,'mycmp');
            echo "TEMParr:$TEMParr<br>";

            gibt folgendes aus:

            TEMParr:Array
            TEMParr:1

            Jap, sorry. ich hab einen Fehler gemacht. Aendere das mal in

            usort($TEMParr,"mycmp");

            statt

            $TEMParr = usort($TEMParr,"mycmp)

            Gruesse,
             CK