Visualizzazione risultati 1 fino 17 di 17

Discussione: [php script] Modifica script: ultimi files di una cartella

  1. #1
    Guest

    Predefinito [php script] Modifica script: ultimi files di una cartella

    Ciao a tutti.
    Io ho questo script:
    Codice PHP:
    <?php

    function my_strip($start,$end,$total){
    $total = stristr($total,$start);
    $f2 = stristr($total,$end);
    return
    substr($total,strlen($start),-strlen($f2));
    }

    $i=0;
    $path="cartella/";

    $handle=opendir($path);
    while ((
    $file_name = readdir($handle))!==false) {

    if(
    stristr($file_name,".php")){
    $url=$path.$file_name;

    $contents="";
    $fd = fopen ($url, "r");
    while(
    $buffer = fread ($fd,1024)){
    $contents .=$buffer;
    }
    $t=my_strip("<h1>","</h1>",$contents);
    $thelist = "<a href=\"{$path}{$file_name}\">".$t.'</a>';
    echo
    $thelist;
    }
    }
    ?>
    Con questo script ho la lista dei files contenuti all'interno di una cartella. Questi files vengono linkati ed i loro nomi prendono il contenuto di un tag a mia scelta.

    Però vorrei, sempre con questo script, estrapolare gli ultimi TOT di files e quindi non tutti.

    Chi mi da una mano nella modifica?

  2. #2
    L'avatar di mycarlo
    mycarlo non è connesso Utente attivo
    Data registrazione
    06-10-2009
    Residenza
    $this->s50
    Messaggi
    467

    Predefinito

    Potresti prima salvare tutti i files in un array, poi ordinare l'array con sort() e infine con un loop (for) limiti un tot di risultati.

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

    Predefinito

    In php, ogni volta che stai per usare un for probabilmente c'è una funzione già fatta. Nel caso, dai un'occhiata ad array_slice.

    Prima però potresti dare una radrizzata al codice esistente, usando glob, file_get_contents, array_map e preg_match

    Codice PHP:
    function prendi_titolo($nomefile) {
    // carica tutto il file
    $testo = file_get_contents($nomefile);

    // espressione regolare per prendere tutto ciò che è in un <h1>, case insensitive
    if ($testo && preg_match('#<h1>(.*)</h1>#i', $testo, $corrispondenze))
    return
    $corrispondenze[1];

    return
    false;
    }

    $path = 'cartella/';

    // elenco di tutti i file .php nella directory $path
    $listafile = glob($path . '*.php');

    // estrae tutti i titoli da questi file
    $listatitoli = array_map('prendi_titolo', $listafile);

    // stampa dei nomi
    foreach ($listafile as $indice => $nomefile)
    echo
    "<a href=\"{$nomefile}\">{$listatitoli[$indice]}</a>";
    Ultima modifica di dreadnaut : 25-02-2010 alle ore 15.10.33

  4. #4
    Guest

    Predefinito

    Grazie ad entrambi per la risposta.

    @dread
    Il codice che mi ha postato mi sembra molto più pulito e più chiaro da capire...
    Ora quindi dovrei far si (con il tuo codice) che vengano estrapolati gli ultimi 5 (esempio) file...
    Per far questo mi stavo basando su questo. Quindi ho provato ad aggiungere il filemtime e il krsort al tuo codice, solo che non riesco ad aggiungere tutto ciò correttamente.
    Mi potresti aiutare?
    Ultima modifica di musicanapoli : 25-02-2010 alle ore 20.02.13

  5. #5
    L'avatar di mycarlo
    mycarlo non è connesso Utente attivo
    Data registrazione
    06-10-2009
    Residenza
    $this->s50
    Messaggi
    467

    Predefinito

    Ammesso che tu voglia ordinarli per la data dell'ultima modifica del file in ordine decrescente:
    Codice PHP:
    <?php
    function prendi_titolo($nomefile) {
    // carica tutto il file
    $testo = file_get_contents($nomefile);

    // espressione regolare per prendere tutto ciò che è in un <h1>, case insensitive
    if ($testo && preg_match('#<h1>(.*)</h1>#i', $testo, $corrispondenze))
    return
    $corrispondenze[1];

    return
    false;
    }

    $path = 'cartella/';

    // elenco di tutti i file .php nella directory $path
    $listafile = glob($path . '*.php');

    $lista = array();

    foreach(
    $listafile as $nomefile) {
    $filemtime = filemtime($nomefile);
    $lista[$filemtime] = $nomefile;
    }

    ksort($lista);

    // inverte l'array per l'odine decrescente
    $listafile = array_reverse($lista);

    // estrae i titoli
    $listatitoli = array_map('prendi_titolo', $listafile);

    // i numeri di files da estrarre
    $risultati = 5;

    foreach (
    $listafile as $indice => $nomefile) {
    if(
    $risultati <= 0)
    break;

    echo
    "<a href=\"{$nomefile}\">{$listatitoli[$indice]}</a>";
    $risultati--;
    }
    ?>
    Ultima modifica di mycarlo : 25-02-2010 alle ore 20.20.19

  6. #6
    Guest

    Predefinito

    Perfetto, volevo proprio questo. Grazie :)

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

    Predefinito

    Nota che in quel modo estrai i titoli da tutti i file, e poi ne mostri solo 5. A seconda del numero di .php, il processo potrebbe essere un po' lento. Puoi evitare così, tagliando prima l'array:

    Codice PHP:
    ...

    // ordina l'elenco (in ordine inverso)
    krsort($listafile);

    // prende i primi 5 elementi
    $listafile = array_slice( $listafile, 5 );

    // estrae i titoli
    $listatitoli = array_map('prendi_titolo', $listafile);

    // stampa
    foreach ($listafile as $indice => $nomefile)
    echo
    "<a href=\"{$nomefile}\">{$listatitoli[$indice]}</a>";
    Ultima modifica di dreadnaut : 25-02-2010 alle ore 20.46.23

  8. #8
    L'avatar di Xsescott
    Xsescott non è connesso AlterGuru
    Data registrazione
    08-02-2004
    Messaggi
    1,413

    Predefinito

    Citazione Originalmente inviato da mycarlo Visualizza messaggio
    Codice PHP:
    <?php
    if($risultati <= 0)
    break;
    ?>
    comunque $risultati non sarebbe mai arrivato ad un numero negativo.
    giusto per puntualizzare
    "Quando il potere dell'amore supererà l'amore per il potere il mondo conoscerà la pace" Jimmy Hendrix


    [ Richiesta: http://www.unibologna.eu/ ] --> [Risposta: http://www.magazine.unibo.it/Magazin...al_Portale.htm Morale] -->[ http://www.anti-phishing.it/news/art...s.13062007.php ]
    consoliwebsite.altervista.org

  9. #9
    Guest

    Predefinito

    @dread Ah, capito...Ho modificato. Grazie.

    Un'ultima cosa.
    Se io nella $path non volessi inserire il nome della cartella, e se quindi volessi estrapolare gli ultimi 5 files da qualunque cartella (non 5 files per ogni cartella, ma 5 files in totale)?

  10. #10
    L'avatar di mycarlo
    mycarlo non è connesso Utente attivo
    Data registrazione
    06-10-2009
    Residenza
    $this->s50
    Messaggi
    467

    Predefinito

    Citazione Originalmente inviato da dreadnaut Visualizza messaggio
    Nota che in quel modo estrai i titoli da tutti i file, e poi ne mostri solo 5. A seconda del numero di .php, il processo potrebbe essere un po' lento. Puoi evitare così, tagliando prima l'array:

    Codice PHP:
    ...

    // ordina l'elenco (in ordine inverso)
    krsort($listafile);

    // prende i primi 5 elementi
    $listafile = array_slice( $listafile, 5 );

    // estrae i titoli
    $listatitoli = array_map('prendi_titolo', $listafile);

    // stampa
    foreach ($listafile as $indice => $nomefile)
    echo
    "<a href=\"{$nomefile}\">{$listatitoli[$indice]}</a>";
    Ora che ci penso hai ragione, è inutile !
    A questo punto si può anche evitare di usare array_reverse sull'intero array:
    Codice PHP:
    ksort($lista);

    // i numeri di files da estrarre
    $risultati = 5;

    // estrae gli ultimi n risultati
    $listafile = array_reverse( array_slice($lista, count($lista) - $risulati)) );

    // estrae i titoli
    $listatitoli = array_map('prendi_titolo', $listafile);

    foreach (
    $listafile as $indice => $nomefile) {
    echo
    "<a href=\"{$nomefile}\">{$listatitoli[$indice]}</a>";
    Citazione Originalmente inviato da Xsescott Visualizza messaggio
    comunque $risultati non sarebbe mai arrivato ad un numero negativo.
    giusto per puntualizzare
    Già hai ragione, avrei potuto usare semplicemente $risultati < 1

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

    Predefinito

    Citazione Originalmente inviato da musicanapoli Visualizza messaggio
    Se io nella $path non volessi inserire il nome della cartella, e se quindi volessi estrapolare gli ultimi 5 files da qualunque cartella (non 5 files per ogni cartella, ma 5 files in totale)?
    array_merge() e basename() ti sono amici

  12. #12
    Guest

    Predefinito

    Al posto di questo:
    Codice PHP:
    $path = 'cartella/';
    $listafile = glob($path . '*.php');
    metto questo:
    Codice PHP:
    $path = 'cartella/';
    $path2 = 'cartella1/';
    $listafile = array_merge( glob($path . '*.php'), glob($path2 . '*.php'));
    Fin qui è giusto?
    Non mi è chiaro come fare con il basename...

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

    Predefinito

    basename ti serve solo se vuoi mostrare i nomi dei file senza directory, vedi tu quindi.

  14. #14
    Guest

    Predefinito

    Ok, avevo provato qualche script con il basename ed effettivamente restituisce il nome del file. Però non ho capito a cosa possa essere utile in questo caso...
    Ricapitolando, io alla fine ho questo script:
    Codice PHP:
    <?php
    function prendi_titolo($nomefile) {
    // carica tutto il file
    $testo = file_get_contents($nomefile);

    // espressione regolare per prendere tutto ciò che è in un <h1>, case insensitive
    if ($testo && preg_match('#<h1>(.*)</h1>#i', $testo, $corrispondenze))
    return
    $corrispondenze[1];

    return
    false;
    }

    $path = 'cartella/';

    // elenco di tutti i file .php nella directory $path
    $listafile = glob($path . '*.php');

    // ordina l'elenco
    krsort($listafile);

    // prende gli ultimi 5 elementi in fondo
    $listafile = array_slice( $listafile, -5 );

    // estrae i titoli
    $listatitoli = array_map('prendi_titolo', $listafile);

    // stampa
    foreach ($listafile as $indice => $nomefile)
    echo
    "<li><a href=\"{$nomefile}\">{$listatitoli[$indice]}</a></li>";

    ?>
    Adesso vorrei prendere gli ultimi 5 files da più cartelle. Quindi ho modificato così.
    In pratica con l'array_merge ho unito due variabili e quindi dovrei estrapolare dati da due cartelle, però non mi da il risultato sperato, quindi immagino che non sia corretto o che comunque devo aggiungere qualcos'altro.

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

    Predefinito

    Mi sono un attimo perso: gli ultimi 5 file secondo che ordinamento?

    Al momento sono ordinati per nome, ma poichè il nome contiene anche il path, tutti i file di una cartella verranno prima di quelli dell'altra.

  16. #16
    Guest

    Predefinito

    No, ok, ho fatto confusione io.

    In poche parole, prima volevo estrapolare gli ultimi 5 files pubblicati da una singola cartella, adesso volevo prendere gli ultimi 5 files pubblicati da diverse cartelle.

    Quindi prima tu hai aggiustato il codice che avevo postato io, poi mycarlo lo ha ri-modificato in modo tale che estrapolassi i files in ordine cronologico.

    Alla fine, riguardando l'intera discussione, sono arrivata a questo codice (aggiungendo anche l'array_merge per aggiunger più path):
    Codice PHP:
    <?php
    function prendi_titolo($nomefile) {
    // carica tutto il file
    $testo = file_get_contents($nomefile);

    // espressione regolare per prendere tutto ciò che è in un <h1>, case insensitive
    if ($testo && preg_match('#<h1>(.*)</h1>#i', $testo, $corrispondenze))
    return
    $corrispondenze[1];

    return
    false;
    }

    $path = 'cartella/';
    $path2 = 'cartella1/';
    $listafile = array_merge( glob($path . '*.php'), glob($path2 . '*.php'));

    $lista = array();

    foreach(
    $listafile as $nomefile) {
    $filemtime = filemtime($nomefile);
    $lista[$filemtime] = $nomefile;
    }


    ksort($lista);

    // i numeri di files da estrarre
    $risultati = 5;

    // estrae gli ultimi n risultati
    $listafile = array_reverse( array_slice($lista, count($lista) - $risultati) );

    // estrae i titoli
    $listatitoli = array_map('prendi_titolo', $listafile);

    foreach (
    $listafile as $indice => $nomefile) {
    echo
    "<a href=\"{$nomefile}\">{$listatitoli[$indice]}</a>";
    }
    ?>
    il quale funziona e fa esattamente quello che volevo io (estrapolare ultimi files pubblicati, da più cartelle).

    Ora non ho capito, la parte che estrae i 5 risultati deve essere modificata o va bene così?
    Ultima modifica di musicanapoli : 28-02-2010 alle ore 20.35.15

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

    Predefinito

    Codice PHP:
    ksort($lista);

    // i numeri di files da estrarre
    $risultati = 5;

    // estrae gli ultimi n risultati
    $listafile = array_reverse( array_slice($lista, count($lista) - $risultati) );
    Questo pezzo è un po' dubbio, perché gira e rigira l'array quando non è necessario. E' più questione di efficienza che altro

    Codice PHP:
    // sort già in ordine inverso, così non serve array_reverse
    krsort($lista);

    // i numeri di files da estrarre
    $risultati = 5;

    // estrae gli ultimi $risultati risultati
    $listafile = array_slice($lista, $risultati) ); // oppure -$risultati se vuoi quelli opposti

Tags for this Thread

Regole di scrittura

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