Ordinare righe file di testo

Salve a tutti,

ho un problema nell'ordinare i dati che estraggo da un file di testo in base a criteri particolari.

Ogni riga del file di testo è di questo tipo:

 12-2-2006||Breve descrizione \n

 12-3-2005||Breve descrizione \n

 12-3-2007||Breve descrizione \n

In pratica le date immesse dal form e scritte sul file di testo potrebbero essere a casaccio. Io voglio prelevarle e mostrarle ordinate per data.Posto il codice fin dove mi sono bloccato:

$filename = "shows_old.txt"; 
$roba=file($filename);

   foreach($roba as $var2)
   {
      $concerto=explode('||', $var2);
      $datac=$concerto[0];
      $evento=$concerto[1];
   
      $id=explode("-", $datac);
      $gio=$id[0];
      $mes=$id[1];
      $an=$id[2];
  
      $id_new=mktime(0,0,0,$mes,$gio,$an,0);
     
     echo"$datac<br>$evento<br>
      [<a href='$_SERVER[PHP_SELF]?conferma=-->$key<---'>Elimina<a>]<br>";

}

Così mi preleva le righe nell'ordine in cui sono state scritte sul file di testo. Non ho capito come rendere il timestamp un id per l'ordinamento.

E poi cosa dovrei mettere al posto di  -->$key<--- per passare un riferimento a "conferma"?

Grazie infinite.

inviato 9 anni fa
brodolio
X 0 X

quando non si usa un DB le cose invece di semplificarsi si complicano...

Per ordinare i risultati devi prima effettuare un ciclo per leggere tutte le righe e ricavare per ciascuna qualcosa che si possa ordinare, ad esempio il timestamp relativo alle date. Questo timestamp potresti utilizzarlo come chiave per un nuovo array. Associata a questa chiave potresti mettere gli altri dati estratti per la riga.

Avendo per chiave un numero (il timenstamp) potresti poi utilizzare una delle funzioni di PHP per ordinare l'array.

Il problema della chiave è più complesso perché nel file di testo non è presente una chiave quindi o ricrei il file aggiungendo un numero diverso per ciascuna riga oppure utilizzi il timestamp calcolato prima, ma devi essere sicuro che sia univoco altrimenti non serve.

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

Si lo so, senza DB è tutto più difficile, però volevo provare comunque. Poi per ora sto realizzando siti  che non necessitano di quantità di informazioni elevate da gestire.Cmq ho risolto l'ordinamento delle righe cosi':

1)Scrivo la riga del file aggiungendo il timestamp della data, usandola come controllo successivamente

//Ricevo i dati dal form di inserimento
$giorno=$_POST['gg'];
$mese=$_POST['mm'];
$anno=$_POST['anno'];
$evento=$_POST['evento'];

  //controllo che la data immessa sia corretta
if (checkdate($mese,$giorno,$anno))
    {

       //Creo una variabile $data_conc del tipo : es.15-11-2007
       $data_conc=$giorno."-".$mese."-".$anno;

       #Creo il timestamp della data inserita
       $data2=mktime(0,0,0,$mese,$giorno,$anno,0);

       #scrivo nel file la riga del tipo : 1223766000||12-10-2008||blablablabla
       $filename = "shows.txt"; 
       $apri = fopen ($filename,"a+");
       fputs($apri,"$data2");
       fputs($apri,"||");
       fputs($apri,"$data_conc");
       fputs($apri,"||");
       fputs($apri,"$evento");
       fputs($apri,"\n");
       fclose($apri);   

2)Estraggo i dati ed effettuo un controllo sul timestamp per l'ordinamento degli eventi divisi tra prossimi e passati:

//Mostro i Concerti divisi tra prossimi e vecchi
 //----------------------------------------------
    echo"Prossimi concerti<br>";
    
    //Apro il file di testo
    $brodo=file($filename);

    //Lo ordino numericamente, in maniera decrescente per avere la data più recente in alto
    array_multisort($brodo,SORT_NUMERIC,SORT_DESC);
    
    //Inizializzo la variabile $i a zero, la usero' come contatore delle righe per avere un id univoco per ognuna
    $i=0;
     
    //Ciclo per leggere le singole righe
     foreach($brodo as $var2)
     {
      
      //Metto nell'array concerto i 3 dati contenuti nella riga
      $concerto=explode('||', $var2);
      $id=$concerto[0];
      $datac=$concerto[1];
      $evento=$concerto[2];
     
      $today = getdate();
      $month = $today['mon'];
      $mday = $today['mday'];
      $year = $today['year'];
         
      //Creo il timestamp della data odierna  
      $data1=mktime(0,0,0,$month,$mday,$year,0);
      
      //Lo confronto con il timestamp della data inserita
      $differenza=$data1-$id;
     
            //Se la differenza e' <0, la data e' successiva a quella odierna
            if($differenza<0) 
   {
           
               echo" $datac<br>$evento<br>";

               //Incremento la variabile $i                 
               $i++;
            
                 }
         else
        {
          echo"Vecchi Concerti:<br>";
          echo"$datac<br>$evento<br>";
        }

In effetti lavorare coi file di testo è senza dubbio più noioso, pero' ero curioso.. :PGrazie cmq per la risposta, spero che il codice postato sia d'aiuto a qualcuno.Ciao!

risposto 9 anni fa
brodolio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda