Scansione di file in una directory: non sono in ordine crescente. Come mai?

gandalf1959

Utente Attivo
21 Nov 2013
208
1
18
Buongiorno a tutti.
Ho una directory sul server che contiene dei pdf il cui nome è numero.pdf.
Ho la necessità di mostrare l'elenco dei file per poterli scaricare.
I file si chiamano 367.pdf, 370.pdf, 376.pdf ecc. e l'ultimo è 402.pdf.
Nella directory li vedo elencati correttamente (367, 370, 376 e via fino al 402).
Quello che ottengo nella mia pagina invece risulta prima il 402 poi 367, 370, 376 eccetera.
Non capisco come mai.
Inoltre la scansione mi ritorna due righe vuote prima del 402.
Ecco la porzione di codice:
PHP:
 //Imposto la directory da leggere
    $directory = "../pdf/2015/dispense/";
    // Apriamo una directory e leggiamone il contenuto.
    if (is_dir($directory)) {
      //Apro l'oggetto directory
      if ($directory_handle = opendir($directory)) {
      //Scorro l'oggetto fino a quando non è termnato cioè false

        include 'connect.php';

        while (($file = readdir($directory_handle)) !== false) {
        //Se l'elemento trovato è diverso da una directory
        
        if((!is_dir($file))&($file!=".")&($file!=".."))
          $nome = basename($file,".pdf");

          $query = ("SELECT * FROM calendario WHERE id_lezione = '$nome'");
          $vai = mysql_query($query);
          $uno = mysql_fetch_assoc($vai);
          $titolo = $uno['titolo'];
          $giorno = $uno['giorno'];
          $mese = $uno['mese'];
          $anno = $uno['anno'];

          $data = $giorno."/".$mese."/".$anno;


        echo $nome . " - " . $data . " - " . "<a href='../pdf/2015/dispense/$file' target='_blank'>" . $titolo . "</a>" . "<br/>";
        }
      //Chiudo la lettura della directory
      closedir($directory_handle);
      }
    }
Non riesco a capire come mai intanto i file non siano nello stesso ordine di esposizione nella directory e poi come mai io ottenga due righe vuote...
Qualcuno ha qualche idea?
Grazie
 
Ciao, la condizione è sbagliata : gli and si scrivono con il doppio &&, in più mancano le parentesi graffe per racchiudere il codice che deve essere eseguito.
 
ok, ma resta il fatto che, a parte il fatto che funziona correttamente e che ho corretto gli &&, resta il fatto che l'elenco che mi restituisce non è nello stesso ordine di ciò che vedo nella directory. I pdf sono dispense relative alle diverse lezioni che nel db sono identificate con un numero progressivo. Lo scopo è quello di ottenere un elenco non tanto dei file, ma delle lezioni corrispondenti, riportando data e titolo che ottengo dal db relativo. Va tutto bene, e non è gravissimo che non siano in ordine, almeno ora che sono poche. Quando saranno molte sarebbe meglio che venissero elencate nell'ordine corretto. E invece la 402 è sempre la prima, poi ricomincia con le altre nell'ordine giusto.
Comunque grazie per la correzione
 
Dimenticavo... una volta a posto le parentesi, le due righe vuote sono scomparse. Per il resto tutto come prima.
la 402 è sempre la prima dispensa visualizzata...
Uffffff
 
Per l'ordinamento dovresti creare un array ordinarlo con sort() e poi ciclarlo oppure utilizzare direttamente la funzione glob() che ti restituisce direttamente un array ordinato.
 
grazie. Non sapevo che glob restituisse direttamente un array ordinato.
Il fatto che sia già all'interno di un ciclo while? In pratica dovrei prima ottenere l'elenco in un array e poi stamparlo a video, mentre adesso stampo riga per riga all'interno di while. Giusto?
 
ciao
glob ti restituisce un array, ma non ordinato, se con ordinato intendi es. con i valori dell'array ordinati in ordine alfabetico o numerico
considera poi che glob accetta i wildcard, esempio
PHP:
<?php
$percorso="tua_cartella/";// o es ="../tua_cartella/"
$file=glob($percorso."*.jpg");
//estrae tutti i file contenuti in tua_cartella con estenzione jpg
sort($file); //li ordina in ordine alfabetico crescente - rsort() inverso
//.....
?>
 
il manuale dice
GLOB_NOSORT - Return files as they appear in the directory (no sorting). When this flag is not used, the pathnames are sorted alphabetically
però non ho testato l'ho presa per buona
 
Ottimo. Ora va tutto benissimo. E siccome alcune dispense non corrispondono al numero di nessuna lezione, ho aggiunto una piccola verifica sul nome, se è numerico fai una cosa, se no un'altra.
Ecco il codice completo:
PHP:
 //Imposto la directory da leggere
    $directory = "../pdf/2015/dispense/";
    //inizializzo l'array
    $numerini = array();
    // Apro una directory e leggo il contenuto.
    if (is_dir($directory)) {
      //Apro l'oggetto directory
      if ($directory_handle = opendir($directory)) {
      //Scorro l'oggetto fino a quando non è terminato cioè false

        while (($file = readdir($directory_handle)) !== false) {
        //Se l'elemento trovato è diverso da una directory
        
        if((!is_dir($file))&&($file!=".")&&($file!="..")) {

          $nom = basename($file,".pdf");
          $numerini[] .= $nom;
        }
      }

      asort($numerini);

      include 'connect.php';

      foreach ($numerini as $key => $nome) {
          $query = ("SELECT * FROM calendario WHERE id_lezione = '$nome'");
          $vai = mysql_query($query);
          $uno = mysql_fetch_assoc($vai);
          $titolo = $uno['titolo'];
          $giorno = $uno['giorno'];
          $mese = $uno['mese'];
          $anno = $uno['anno'];

          $data = $giorno."/".$mese."/".$anno;

          if (is_numeric($nome)) {
            $query = ("SELECT * FROM calendario WHERE id_lezione = '$nome'");
            $vai = mysql_query($query);
            $uno = mysql_fetch_assoc($vai);
            $titolo = $uno['titolo'];
            $giorno = $uno['giorno'];
            $mese = $uno['mese'];
            $anno = $uno['anno'];

            $data = $giorno."/".$mese."/".$anno;


            echo $nome . " - " . $data . " - " . "<a href='../pdf/2015/dispense/$file' target='_blank'>" . $titolo . "</a>" . "<br/>";
          }else{
            echo $nome . ": <a href='../pdf/2015/dispense/$file' target='_blank'>scarica</a><br>";
          }
          
          



        }
        }
      //Chiudo la lettura della directory
      closedir($directory_handle);
      }
E come sempre grazie per l'aiuto.
Alla prossima!
 

Discussioni simili