Directory Listing, sorting

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
Άβαταρ μέλους
RioSif
Δημοσιεύσεις: 10
Εγγραφή: 04 Μαρ 2009 00:40
Επικοινωνία:

Directory Listing, sorting

Δημοσίευση από RioSif » 04 Μαρ 2009 00:41

Έχω φτιάξει ένα site το οποίο στην ουσία είναι μία λίστα από αρχεία ταξινομημένα σε φακέλους.
Πχ: φάκελος "2009", μέσα στον φάκελο έχουμε φακέλους "Ιανουάριος", "Φεβρουάριος", "Μάρτιος", και μέσα σε κάθε από αυτούς τους φακέλους έχουμε pdf αρχεία με filename την ημερομηνία κάθε μέρας, δηλαδή "Τρίτη 3 Μαρτίου 2009", "Τετάρτη 4 Μαρτίου 2009" κτλ.
Με php κώδικα εμφανίζονται τα αρχεία ταξινομημένα βάση της ημερομηνίας που έγιναν modify.
Μέχρι εδώ καλά και μέχρι χθες όλα δούλευαν οκ. Κάτι συνέβη όμως και άλλαξε το modify date των φακέλων και πήραν όλα την ίδια ημερομηνία με αποτέλεσμα να μπερδεύονται και να μην εμφανίζονται με την σειρά που θέλω, δηλαδή ταξινομημένα με την σειρά που πάνε οι μήνες δηλαδή Ιανουάριος, Φεβρουάριος, Μάρτιος αλλά έγιναν Ιανουάριος, Μάρτιος, Φεβρουάριος.
Ο κώδικας που χρησιμοποιώ μέχρι τώρα είναι αυτός:

Κώδικας: Επιλογή όλων

if ($files) 
array_multisort(
    array_map( 'filemtime', $files ),
    SORT_NUMERIC,
    SORT_DESC,
    $files
);
ως file θεωρείτε κάθε αρχείο ή φάκελος.

Καμία ιδέα πως να μετατρέψω τον κώδικα ή τι άλλο θα μπορούσα να κάνω για να εμφανίζονται σωστά τα αρχεία κ οι φάκελοι? Δεν θέλω να αναγκαστώ να έχω φακέλους με ονόματα 1-Ιανουάριος, 2-Φεβρουάριος κτλ κ να κάνω sort by name...

Ευχαριστώ!

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

Directory Listing, sorting

Δημοσίευση από Apostolis_38 » 04 Μαρ 2009 15:44

Υποθέτω πως θα μπορούσες να βάλεις κάτι σε στύλ:

Κώδικας: Επιλογή όλων

if ($files == "ΙΑΝΟΥΑΡΙΟΣ")
{
$files = "1";
}
elseif ($files == "ΙΑΝΟΥΑΡΙΟΣ")
{
$files = "2";
}
κ.λ.π. κ.λ.π. και να κάνεις ταξινόμηση σύμφωνα με τους αριθμούς.

Άβαταρ μέλους
dik_
Δημοσιεύσεις: 476
Εγγραφή: 07 Ιουν 2007 11:28

Directory Listing, sorting

Δημοσίευση από dik_ » 04 Μαρ 2009 18:53

Στα γρήγορα:

Κώδικας: Επιλογή όλων

function sort_month($m1, $m2){
    $months = array(
        'Ιανουάριος' => 1,
        'Φεβρουάριος' => 2,
        'Μάρτιος' => 3,
    );

    return $months&#91;$m1&#93; <= $months&#91;$m2&#93; ? -1 &#58; 1;
&#125;

$test = array&#40;'Μάρτιος', 'Φεβρουάριος', 'Ιανουάριος'&#41;;

usort&#40;&$test, sort_month&#41;;

print_r&#40;$test&#41;;

Κώδικας: Επιλογή όλων

Array
&#40;
    &#91;0&#93; => Ιανουάριος
    &#91;1&#93; => Φεβρουάριος
    &#91;2&#93; => Μάρτιος
&#41;

Άβαταρ μέλους
ThyClub
Honorary Member
Δημοσιεύσεις: 5312
Εγγραφή: 17 Νοέμ 2003 00:21
Τοποθεσία: Hell's Kitchen
Επικοινωνία:

Directory Listing, sorting

Δημοσίευση από ThyClub » 04 Μαρ 2009 19:13

Δεν θέλω να αναγκαστώ να έχω φακέλους με ονόματα 1-Ιανουάριος, 2-Φεβρουάριος κτλ κ να κάνω sort by name...
Και γι αυτό κάνει :

Κώδικας: Επιλογή όλων

array_map&#40; 'filemtime', $files &#41;,
Αν κατάλαβα καλά είναι στο modification time των αρχείων σου?

Άβαταρ μέλους
RioSif
Δημοσιεύσεις: 10
Εγγραφή: 04 Μαρ 2009 00:40
Επικοινωνία:

Directory Listing, sorting

Δημοσίευση από RioSif » 04 Μαρ 2009 20:28

Σας ευχαριστώ πολύ, το πρώτο το δοκίμασα κ δεν δουλεύει. Του dik θα το δοκιμάσω αργότερα κ θα σας πω.
ThyClub ναι, βλέπει το modification time των αρχείων κ τα ταξινομή βάση αυτού. Αλλά αν γίνει καμία στραβεί όπως έγινε κ γίνουν για κάποιο λόγο modify τα αρχεία ή οι φάκελοι θα πάνε όπως νά'ναι...

Άβαταρ μέλους
RioSif
Δημοσιεύσεις: 10
Εγγραφή: 04 Μαρ 2009 00:40
Επικοινωνία:

Directory Listing, sorting

Δημοσίευση από RioSif » 05 Μαρ 2009 02:26

Λοιπόν δυστηχώς δεν βρήκα άκρη ούτε με των κώδικα του dik_. Πιθανότατα να μην των γράφω σωστά.
Γι'αυτό παραθέτω όλο τον κώδικα και αν έχει κάποιος χρόνο ας ρίξει μια ματιά...

Κώδικας: Επιλογή όλων

<?
  /***
   * php-directory-listing, version 0.3.0
   * Copyright &#40;C&#41; 2005 and onwards, Raphael J. Schmid <raphael@schwarzschmid.de>
   * Licensed under the GNU GPL, the version of your liking.
   * Do copy, share and modify!
   * 
   * Additions in functionality by Andreas Aronsson <aron@aron.nu>.
   ***/

  error_reporting&#40;E_ALL&#41;;
  require_once path&#40;__FILE__&#41;.'Thumbnail.class.php'; 
  
  class DirectoryListing &#123;
    var $EXCLUDE_FILES = array&#40;
      ".",
      "..",
      ".htaccess",
      ".thumbnails",
      "index.php",
      "DirectoryListing.class.php",
      "Thumbnail.class.php",
      "visible.css",
      "hidden.css",
      "index.css",
      "icons",
      ".icons" // ,
               // ".???"
    &#41;;

    var $FILETYPE_ICON_PATH = '.icons';

    var $_filetype_icon_path;

    var $_thumbnail_width;
    var $_thumbnail_height;
    var $_thumbnail_quality;
    var $_max_filename_length;
    var $_max_content_length;
    
    function DirectoryListing&#40;
      $path, 
      $columns = 4,
      $width = 75,
      $height = NULL, 
      $max_filename_length = 80,
      $max_content_length = 60,
      $quality = 80
    &#41;  &#123;

      echo "<table>\n"; 
      $this->filetype_icon_path = $this->FILETYPE_ICON_PATH.$this->pd&#40;&#41;;
    
      $this->thumbnail_width = $width;
      $this->thumbnail_height = $height;
      $this->max_filename_length = $max_filename_length;
      $this->max_content_length = $max_content_length;
      $this->thumbnail_quality = $quality;
      
      $dir_handle = @opendir&#40;$path&#41; or die&#40;"Unable to open $path"&#41;;
      $cnt = 0;

      $dirs = array&#40;&#41;;
      $files = array&#40;&#41;;

      // Split the file and directory cases.
      // Add trailing slash if directory.
      while &#40;false !== &#40;$file=readdir&#40;$dir_handle&#41;&#41;&#41;
      &#123;
        if &#40;substr&#40;$file,0,1&#41;!="."&#41; &#123;
          if &#40;is_dir&#40;$path.$file&#41;&#41; &#123;
            array_push&#40;$dirs, $file.'/'&#41;;
          &#125; else &#123;
            array_push&#40;$files, $file&#41;;
          &#125;
        &#125;
      &#125;

      @closedir&#40;$dir_handle&#41;;

      // Sorting alphabetically.
      if &#40;$files&#41; &#123;
        natcasesort&#40;$files&#41;;
      &#125;
      if &#40;$dirs&#41; &#123;
        natcasesort&#40;$dirs&#41;;
      &#125;

      $files=array_merge&#40;$dirs,$files&#41;;

      foreach &#40; $files as $file &#41; &#123;
        if &#40;! in_array&#40;$file, $this->EXCLUDE_FILES&#41;&#41; &#123;
          if &#40;$cnt++ == 0&#41; &#123;
            echo "\t\t<tr>\n";
          &#125;
        
          echo "\t\t\t<td>".$this->href&#40;$file&#41;."</td>\n";
          if &#40;$cnt == $columns&#41; &#123;
            echo "\t\t</tr>\n";
            $cnt = 0;
          &#125;
        &#125;
      &#125;

      if &#40;$cnt != $columns&#41; 
      echo "\t\t</tr>\n";
      echo "\t</table>\n";
      
      @closedir&#40;$dir_handle&#41;;
    &#125;

    function href&#40;$file&#41;
    &#123;
      $type = $this->type&#40;$file&#41;;
      $href = '<a href="'.$file.'"><span class="thumbnail">';

      if &#40;is_dir&#40;$file&#41;&#41; &#123;
        $href .= '<img src="'.$this->filetype_icon_path.'directory.png"/>';
      &#125; else &#123;
        switch&#40;$type&#41; &#123;
          case 'jpg'&#58;
          case 'png'&#58;
          case 'gif'&#58;
          case 'jpeg'&#58;
          case 'jpe'&#58;
          $tn = new Thumbnail&#40;$file, $this->thumbnail_width, $this->thumbnail_height, $this->thumbnail_quality&#41;;
          if &#40;$tn&#41; $href .= '<img src="'.$tn->getPath&#40;&#41;.'"/>';
          break;
  
          case 'txt'&#58;
          case 'html'&#58;
          case 'c'&#58;
          case 'cpp'&#58;
          case 'h'&#58;
          case 'rb'&#58;
          case 'py'&#58;
          case 'php'&#58;
          case 'pl'&#58;
          case 'asp'&#58;
          $fh = fopen&#40;$file, 'r'&#41;;
          if &#40;$fh&#41; $href .= substr&#40;fread&#40;$fh, filesize&#40;$file&#41;&#41;, 0, $this->max_content_length&#41;;
          break;
  
          default&#58;
          $href .= '<img src="'.$this->filetype_icon_path;
          if &#40;is_file&#40;$this->filetype_icon_path.$type.'.png'&#41;&#41; $href .= $type;
          else $href .= 'unknown';
          $href .= '.png"/>';
          break;
        &#125;
      &#125;

      $href .= '</span>';
      $words = $this->words&#40;substr&#40;$file, 0, $this->max_filename_length&#41;&#41;;
      $underscore = '<span class="hidden">_</span>';
      
      $cnt = 0;
      $link_text = '';
      
      foreach &#40;$words as $word&#41; &#123;
        if &#40;$cnt++ > 0&#41;  $link_text .= $underscore;
        $link_text .= $word;
      &#125;
        
      if &#40;$type&#41; $type = '<span class="hidden">'.$type.'</span>';
      if &#40;strlen&#40;$file&#41; > $this->max_filename_length&#41; $type = '...'.$type;
      else if &#40;$type&#41; $type = '.'.$type;

      if &#40;is_dir&#40;$file&#41;&#41; $href .= $link_text."/</a>";
      else $href .= $link_text.$type."</a>";
      
      return $href;
    &#125;

    function words&#40;$file&#41;
    &#123;
      $words = explode&#40;'_', trim&#40;$file&#41;&#41;;
      $last_word = array_pop&#40;$words&#41;;
      $last_word = explode&#40;'.', $last_word&#41;;
      $last_word = $last_word&#91;0&#93;;
      $words&#91;&#93; = $last_word;
      return $words;
    &#125;
  
    function type&#40;$file&#41;
    &#123;
      $chunks = explode&#40;'.', trim&#40;$file&#41;&#41;;
  
      if &#40;count&#40;$chunks&#41; > 1&#41;
      return array_pop&#40;$chunks&#41;;
  
      else
      return false;
    &#125;
    
    function pd&#40;&#41;
    &#123;
      $OS = strtolower&#40;substr&#40;PHP_OS, 0, 3&#41;&#41;;
      $OS == 'win' ? $PD = '\\' &#58; $PD = '/';
      return $PD;
    &#125;
  &#125;
?>
Στο σημείο που λέει:

Κώδικας: Επιλογή όλων

      // Sorting alphabetically.
      if &#40;$files&#41; &#123;
        natcasesort&#40;$files&#41;;
      &#125;
      if &#40;$dirs&#41; &#123;
        natcasesort&#40;$dirs&#41;;
      &#125;
έχω κάνει αλλαγή και έχω βάλει:

Κώδικας: Επιλογή όλων

// Sort files by modified time, latest to earliest
// Use SORT_ASC in place of SORT_DESC for earliest to latest

if &#40;$files&#41; &#123;
array_multisort&#40;
    array_map&#40; 'filemtime', $files &#41;,
    SORT_NUMERIC,
    SORT_DESC,
    $files
&#41;;
&#125;
αλλά δεν εξυπηρετή ούτε αυτό πλεον όπως προείπα.

Ευχαριστώ!

Άβαταρ μέλους
ThyClub
Honorary Member
Δημοσιεύσεις: 5312
Εγγραφή: 17 Νοέμ 2003 00:21
Τοποθεσία: Hell's Kitchen
Επικοινωνία:

Directory Listing, sorting

Δημοσίευση από ThyClub » 05 Μαρ 2009 09:41

κάνε ενα print_r($files); να δούμε τι σου επιστρέφει.

Άβαταρ μέλους
RioSif
Δημοσιεύσεις: 10
Εγγραφή: 04 Μαρ 2009 00:40
Επικοινωνία:

Directory Listing, sorting

Δημοσίευση από RioSif » 05 Μαρ 2009 23:25

Αυτό μου βγάζει, αν αυτό εννοείς:

Κώδικας: Επιλογή όλων

Array &#40; &#91;0&#93; => Μάρτιος &#91;1&#93; => error_log &#91;2&#93; => Φεβρουάριος &#91;3&#93; => Ιανουάριος &#91;4&#93; => index.php &#41;
Δεν ξέρω αν το έγραψα στο σωστό σημείο το print:

Κώδικας: Επιλογή όλων

// Sort files by modified time, latest to earliest 
// Use SORT_ASC in place of SORT_DESC for earliest to latest 

if &#40;$files&#41; &#123; 
array_multisort&#40; 
    array_map&#40; 'filemtime', $files &#41;, 
    SORT_NUMERIC, 
    SORT_DESC, 
    $files 
&#41;; 
print_r&#40;$files&#41;;
&#125;
(Tα αρχεία error_log και index.php υπάρχουν σε κάθε folder αλλά τα κρύβω)

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες