Visualizzazione risultati 1 fino 8 di 8

Discussione: php lista file da cartella in ordine cronologico

  1. #1
    Guest

    Predefinito php lista file da cartella in ordine cronologico

    ciao a tutti.

    vorrei includere una lista di file presenti in una cartella in ordine cronologico. ho già trovato questi esempi, ma non so come procedere. potreste aiutarmi?

    quello che uso attualmente è questo (crea la lista e i link relativi, ma non li mette in ordine cronologico) :

    Codice PHP:
    <?php

    $cartella
    = opendir('path della cartella rispetto al codice');
    while (
    $file = readdir($cartella)) {
    $file_array[] = $file;
    }

    foreach (
    $file_array as $file) {
    # se il file inizia con .. lo tralascio
    if ( $file == ".." || $file == ".") {
    continue;
    }
    #trovo i file e creo il link
    echo "<TR><TD><CENTER>";
    $e=substr(strrchr($file, "."), 0); // azzero l'estensione
    $a=""; //sostituisco lo spazio vuoto con il relativo codice html
    $b=" ";
    $nome1=ereg_replace($e, $a, $file); // sostituisco codice 1
    $nome=ereg_replace("_", "$b", $nome1); //sostituisco codice 2. Sta parte qui l'ho fatta un pò male.... dovresti rivederla e farla meglio, ho fatto un paio di passaggi per niente....

    echo "<a href=\"$file\" title=\"$nome\" class=\"link1\"><b>$nome</b></a><br>"; //questo crea il link

    }
    ?>
    molto interessante è anche questo :
    http://dreadnaut.altervista.org/prog...st-esempio.php
    Ultima modifica di dreadnaut : 28-12-2008 alle ore 13.30.47 Motivo: + tag [php]

  2. #2
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,306

    Predefinito

    Citazione Originalmente inviato da studmad Visualizza messaggio
    molto interessante è anche questo :
    http://dreadnaut.altervista.org/prog...st-esempio.php
    grazie

    per ordinare in base alla data (di ultima modifica) dovresti utilizzare la funzione filemtime() per ogni file della lista, e poi ordinare in nomi in base alle date. Puoi fare ciò con due array, ovvero con un array di coppie <nomefile,datafile> ed usando poi la funzione uasort().
    Codice:
    array (
      [0] => array (
                 'nome' => 'prova.txt'
                 'data' => 1230043124
      )
    )

    In effetti il mio esempio di lista per file non ha metodi per riordinare gli elementi, ma se hai voglia di guardare nel sorgente potresti aggiungere [i]dentro la classe[/url] queste due funzioni che ho buttato giù adesso:
    Codice PHP:
    class DFileList {

    ...

    // ----> sortList() ---------------------------------------------------
    function sortList(&$list, $elem = 'name') {
    if (!isset(
    $list['files']))
    return
    false;
    return
    uasort ( $list['files'],
    create_function('$a,$b', "return (\$a['$elem'] < \$b['$elem'])? -1 : ((\$a['$elem'] > \$b['$elem'])? 1: 0);") );
    }

    // ----> reverseList() ------------------------------------------------
    function reverseList(&$list) {
    if (!isset(
    $list['files']))
    return
    false;
    $list['files'] = array_reverse( $list['files'], true );
    return
    true;
    }
    che vanno chiamate dopo getList() e prima di renderList()
    Codice PHP:
    ...
    $elenco = $dfl->getList();
    ...
    $dfl->sortList($elenco, 'time');
    $dfl->reverseList($elenco);
    ...
    $dfl->renderList($elenco);
    ora su due piedi mi sembra funzionino; più tardi controllo, le documento, e le metto online in una nuova versione del tutto.
    Ultima modifica di dreadnaut : 28-12-2008 alle ore 14.16.55

  3. #3
    Guest

    Predefinito

    grazie! purtroppo però non ho capito come fare. ho aggiunto queste due funzioni nel file dFileList.inc.php
    Codice:
    {
    // ----> sortList() ---------------------------------------------------
      function sortList(&$list, $elem = 'name') {
        if (!isset($list['files']))
          return false;
        return uasort ( $list['files'],
          create_function('$a,$b', "return (\$a['$elem'] < \$b['$elem'])? -1 : ((\$a['$elem'] > \$b['$elem'])? 1: 0);") );
      }
    
    // ----> reverseList() ------------------------------------------------
      function reverseList(&$list) {
        if (!isset($list['files']))
          return false;
        $list['files'] = array_reverse( $list['files'], true );
        return true;
      }
    ma per quanto riguarda il discorso del filemtime, uasort, ecc. non ho capito.
    Ultima modifica di studmad : 28-12-2008 alle ore 16.02.43

  4. #4
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,306

    Predefinito

    il discorso era se volevi farlo per conto tuo. filemtime() è la funzione che ti restituisce la data di modifica di un file - la chiave su cui tu volevi ordinare la lista dei nomi. uasort() è la funzione che riordina una lista in base ad una funzione da te scelta, ad esempio il confronto fra le dati dei file. Potresti usarla ad esempio così **

    Codice PHP:
    function confrontoDate($file1, $file2) {
    $data1 = filemtime($file1);
    $data2 = filemtime($file2);
    if (
    $data1 > $data2) return 1;
    if (
    $data1 < $data2) return -1;
    return
    0;
    }

    ...

    $elenco_file = glob('mia_directory/*');
    uasort( $elenco_file, "confrontoDate");
    ma potrebbe essere assai lenta, visto che richiama due volte filemtime() ad ogni confronto! allora è meglio prendere tutte le date una volta sola, metterle in un array apposito, ed usare quello.

    Codice PHP:
    $elenco_file = glob('mia_directory/*');
    $elenco_date = array();
    foreach (
    $elenco_file as $nomefile)
    $elenco_date[$nomefile] = filemtime($nomefile);

    function
    confrontoDate2($file1, $file2) {
    global
    $elenco_date;
    if (
    $elenco_date[$file1] > $elenco_date[$file2]) return 1;
    if (
    $elenco_date[$file1] < $elenco_date[$file2]) return -1;
    return
    0;
    }

    ...

    uasort( $elenco_file, "confrontoDate2");
    la funzione sortList() sopra fa esattamente questo, ma può ordinare in base a qualsiasi campo (nome, dimensione, data, tipo di file, permessi, contenuto, etc.), mentre la seconda inverte l'ordine, perché a volte è utile

    per usarle, vedi l'esempio online e il mini-esempio in fondo al mio post sopra.

    ** il codice in questo posto non è stato testato!
    Ultima modifica di dreadnaut : 28-12-2008 alle ore 16.12.51

  5. #5
    Guest

    Predefinito

    ci sono riuscito!!!

    dopo aver inserito le 2 funzioni precedenti nel file , bisogna aggiungere
    Codice:
      echo $l->sortList($elenco, 'time');
      echo $l->reverseList($elenco);
    nella pagina scelta (ad es.dfl-sample-medium.php) verso la fine, dove ad es. c'è
    Codice:
    $elenco = $l->getList( DFL_DIRECTORY | DFL_DIRFIRST );
    
    
    
    echo " <table> <thead>\n  <tr><td id=\"c-type\">Tipo</td><td id=\"c-name\">Nome</td><td id=\"c-time\">Ultima modifica</td><td id=\"c-size\">Dimensione</td></tr>\n </thead> <tbody>\n  ";
    
      echo $l->renderList( $elenco );
    
      echo "\n </tbody> </table>\n";
    
    
    
      echo "\n <p id=\"summary\"><b>Totale</b>: " . makeSize($elenco['total']['size']);
    
      echo " ({$elenco['total']['dir']} directory e {$elenco['total']['files']} file)</p>";
    
      
    
      echo "\n <p id=\"about\"><small>" . $l->about() . '</small></p>';
    
    ?>
    
    
    </body></html>
    sopra
    Codice:
      echo $l->renderList( $elenco );
    grazie mille dreadnaut! buone feste!

  6. #6
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,306

    Predefinito

    echo per le due funzioni non è necessario - l'importante è che l'ordine sia questo:
    Codice PHP:
    $elenco = $l->getList();
    ...
    $l->sortList($elenco, 'time');
    $l->reverseList($elenco);
    ...
    echo
    $l->renderList($elenco);

    invece di [ code ], puoi usare il tag [ php ] ed ottenere il codice evidenziato

  7. #7
    Guest

    Predefinito

    ti ringrazio tanto dreadnaut!

    funziona benissimo! vorrei solamente sapere ancora se esite il modo di togliere l'estensione ai file che vengono inclusi nella lista. ho cercato di capire il "setTransform", ma non ci sono riusciuto

  8. #8
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,306

    Predefinito

    ti serve la funzione pathinfo() per tagliare il nome via dalla stringa, e poi la usi sul campo "name" del file:

    Codice PHP:
    function tagliaNome($nomefile) {
    return (
    strstr($nomefile, '.'))?
    substr($nomefile,0,strrpos($nomefile,'.')) :
    $nomefile;
    }

    ...

    $l->setTransform('name', 'tagliaNome');
    la chiamata a setTransform() va fatta sempre prima di quella a renderList()
    Ultima modifica di dreadnaut : 27-01-2009 alle ore 16.10.53 Motivo: corretta funzione, compatibile php4. Altrimenti pathinfo()

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •