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
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
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.
 

gandalf1959

Utente Attivo
21 Nov 2013
208
1
18
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
 

gandalf1959

Utente Attivo
21 Nov 2013
208
1
18
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
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
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.
 

gandalf1959

Utente Attivo
21 Nov 2013
208
1
18
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?
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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
//.....
?>
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
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
 

gandalf1959

Utente Attivo
21 Nov 2013
208
1
18
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
Autore Titolo Forum Risposte Data
filippino File robots.txt e frequenza di scansione googlebot SEO e Posizionamento 0
D Problema errori di scansione 404 SEO e Posizionamento 1
S Problema scansione all'avvio Windows e Software 2
A scansione di una Tabella del DB PHP 2
MarcoGrazia Strumenti di Webmaster: errori di scansione! Google Search Console 1
flavioweb Ultima scansione del sito da parte di google SEO e Posizionamento 2
D scansione ip automatica Reti LAN e Wireless 0
U scansione parole in una pagina Classic ASP 3
chika chan scansione scanner Linux e Software 0
C Rifare logo da una scansione help Webdesign e Grafica 15
E fpdf salvare e aprire il file PHP 4
I asp | includere un file, indirizzo depositato in un db Classic ASP 0
felino [Windows 10] Scompare icone, file e collegamenti sul desktop Windows e Software 0
S passare un valore da un form a un file .php con metodo post PHP 4
D Miglior modo per estrarre le occorrenze di un elemento in un set di più file xml e quindi scrivere il risultato in una tabella Excel o magari in JSON XML 0
G file CSS contenente variabili HTML e CSS 1
M Creare traccia di download file sul server HTML e CSS 2
I elimina file PHP 1
I cerca file sottocartella unlink file PHP 0
I sessione username scarica file PHP 1
S Aggiornare percorso file collegati MS Access 0
I lista file sottocartella elimina file PHP 3
F comando di inclusione file audio in I-Pad non funziona HTML e CSS 1
D protezione cartelle: blocco visualizzazione/scaricamento contenuto, ma abilitazione utilizzo dati da parte di file .php presenti sul sito Web Server 1
I visualizza file sottocartella elimina singolo file PHP 1
I caricamento file in sottocartella nome utente PHP 3
I cartella sottocartella apri o scarica file pdf PHP 1
K Sfondo nuovo file Photoshop 0
C Wp-admin a file php WordPress 5
G Importazione file .sql Web Server 0
csi Inviare file jpg in locale alla stampante con php PHP 0
otto9due Proteggere una cartella e file con password tramite .htaccess e .htpasswd Web Server 0
MarcoGrazia HTML5 <picture> e i file source HTML e CSS 2
MarcoGrazia criptare un file PHP 2
U Link a doppio file PHP PHP 0
U Link a pagina ed esecuzione file PHP 0
U PHP creare un file excel dopo ricerca nel DB PHP 0
I Documento file word Java 0
FDF182 file .bin nell' email PHP 0
E Sito violato, file modificati, cartelle create WordPress 1
F LETTURA FILE SU DIRECTORY IN RETE Javascript 0
Y Percorso assoluto file immagine HTML e CSS 9
M Durata di un file MP4 Classic ASP 1
L problema collegamento file css con html HTML e CSS 1
otto9due Proteggere file caricati dall'esterno ma renderli accessibili per gli utenti loggati. PHP 4
Y Problema percorso file in rete PHP 1
otto9due Impedire esecuzione diretta dei file PHP 7
E Problema accesso a file con app sviluppata con MIT APP INVENTOR 2 Sviluppo app per Android 0
Couting95 inserire dati da un file di testo in una tabella in php PHP 1
keyascii File temporanei Sessioni PHP 6

Discussioni simili