Visualizzazione risultati 1 fino 10 di 10

Discussione: [PHP] un append "al contrario"

  1. #1
    Guest

    Predefinito [PHP] un append "al contrario"

    Ciao di nuovo
    Stavo realizzando una shoutbox molto semplice, scrive i dati su un file di testo, dopo aver effettuato un implode, e li salva uno per riga.

    Dopodichè per leggerli uso un explode,e li visualizzo.

    Facendo così però, gli ultimi messaggi scritti stanno in basso, io vorrei che come in tutte le normali shoutbox l'ultimo messaggio comparisse in alto

    per fare questo avrei due alternative ho pensato, scrivere in cima al file, invece che in append, oppure leggere dal basso verso l'alto...

    a scrivere in cima al file ho provato con vari tipi di Fopen, ma sembra che ognuna delle modalita d'apertura, oltre a posizionare il puntatore all'inizio, cancelli l'intero file, prima di scrivere, cosa che non mi sta bene...

    non saprei nemmeno come fare a leggere usando file() dal basso verso l'alto...
    Come potrei fare?

  2. #2
    Ospite Guest

    Predefinito

    Hai pensato di usare la funzione array_reverse()?
    Restituisce gli elementi di un array in ordine inverso.

  3. #3
    L'avatar di seneca
    seneca non è connesso Super Moderatore
    Data registrazione
    18-12-2004
    Residenza
    la Città Eterna
    Messaggi
    8,376

    Predefinito

    a me viene in mente una cosa un pò rustica, ma efficace: metti i messaggi in un array e poi lo leggi partendo dall'ultimo (decrementando di volta in volta l'indice) invece che dal primo.
    poi magari esiste una funzione che ti legge al contrario...

    EDIT: ecco vedi, probid ti ha fornito la funzione di cui sospettavo l'esistenza

    Ciao!
    Ultima modifica di seneca : 20-07-2007 alle ore 23.41.28


    -- Aut Roma Aut Nihil!

  4. #4
    Guest

    Predefinito

    Ho usato la funzione array reverse :)
    Eppure sembrava complicato xD
    grazie :D

    P.S. a breve ho finito con la mia serie di script... una specie di "CMS" per i download :P

    EDIT: altra domanda, se io volessi cancellare l'ultima riga, per evitare che il file si allunghi troppo?

  5. #5
    Ospite Guest

    Predefinito

    array_pop()

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

    Predefinito

    per il file c'è ftruncate, ma devi fare i conti giusti... è quasi più facile sovrascriverlo con un array accorciato, con array_pop come dice Probid, o array_slice

  7. #7
    Guest

    Predefinito

    Citazione Originalmente inviato da dreadnaut
    per il file c'è ftruncate, ma devi fare i conti giusti... è quasi più facile sovrascriverlo con un array accorciato, con array_pop come dice Probid, o array_slice
    Ci sono, basta fare ftruncate, con numero di bytes da togliere, pari alla lunghezza dell'ultimo elemento dell'array, che posso farmi restituire tramite la funzione array_pop...
    sembra un idea buona, vi aggiorno sugli sviluppi

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

    Predefinito

    ehm, forse è meglio che tu legga quella pagina una seconda volta...
    ftruncate — Truncates a file to a given length
    Devi passargli la posizione alla quale vuoi tagliare, nel tuo caso la somma delle lunghezze dei i messaggi che vuoi tenere (newline inclusi).

    se vuoi, puoi cavartela calcolandola con
    Codice PHP:
    filesize( $f ) - strlen( $ultimomess )

  9. #9
    Guest

    Predefinito

    Uhm... qualcosa non va...
    assumendo che io abbia gia letto le righe del file tramite la funzione file() e le abbia memorizzate nell'array $righe

    Codice PHP:
    if (count($righe)>$max_memory) {
    $handle = fopen('utenti/shoutbox.php',"r");
    $dim = filesize('utenti/shoutbox.php')-strlen($righe[count($righe)+1]);
    ftruncate($handle,$dim);
    }
    la prima riga corrisponde alla riga numero 40, l'errore non blocca l'esecuzione del programma, però il file non viene accorciato:

    Notice: Undefined offset: 14 in shoutbox.php on line 42

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

    Predefinito

    gli array cominciano a contare da zero
    Però non sono certo che aprendo il file come "r" tu riesca poi a troncarlo... e inoltre, se ci sono più righe che "avanzano" ?

    consiglierei:
    Codice PHP:
    if (count($righe) > $max_righe)
    {
    if (
    $handle = fopen('utenti/shoutbox.php', 'w') )
    {
    $dim = filesize('utenti/shoutbox.php')
    -
    strlen( implode( '', array_slice($righe, $max_righe) ) );
    ftruncate($handle, $dim);
    fclose($handle);
    }
    }
    dove suppongo che $righe contenga il file come letto ad esempio da file(), una riga per elemento dell'array, incluso il newline per ogni riga (non trim()-med)
    Ultima modifica di dreadnaut : 21-07-2007 alle ore 11.50.46

Regole di scrittura

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