Visualizzazione dei risultati da 1 a 6 su 6

Discussione: Ordinare cartelle

  1. #1

    Ordinare cartelle

    Buon pomeriggio a tutti.
    Attraverso questo script:
    Codice PHP:
    $path "DOC/Report/";
    $array_delle_dir = array(0=>"milan",1=>"lazio",2=>"inter",3=>"napoli",4=>"vicenza",5=>"juve");
    if (
    is_dir($path)) {
    foreach (
    $array_delle_dir as $dir) {
                            
                            
                                echo 
    "<a id='menu".$dir."' href=\"javascript:aprichiudi('$dir');\">[img]img/cartella_chiusa.jpg[/img]</a>" $dir"";
                                echo 
    "<div id='".$dir."' style='display: none; margin-left: 2em;'>";
                                echo 
    "<ul style='list-style:none;text-decoration:none'>\n";
                                
    $dh = @opendir($path.$dir);
                                while (
    $file = @readdir($dh)) {
                                    if (!
    preg_match("#^\.\.?$#"$file)) {
                                        echo 
    "[*][img]icone/icon_txt.png[/img]REPORT: <a href=\"".$path.$dir."/".$file."\" onclick=\"window.open(this.href);return false;\">"$file ."</a> - <a href=\"javascript: mailsome1('$file','$dir');\">Elimina</a>\n";
                                    }
                                }
                                @
    closedir($dh);
                                echo 
    "[/list]</div>
    \n"
    ;
                        }

    visualizzo in ordine le cartelle che ho nella dir principale Report.
    Attraverso l'ordine dato nell'array_delle_dir in visualizzazione mi fa vedere anche quelle cartelle che non ci sono più come "vicenza".
    La mia domanda è: come posso,attraverso un controllo delle dir, verificare se, la cartella presente nell'array non è presente all'interno della directory Report, di non prenderla in considerazione?
    Ho pensato di farein questo modo:
    Codice PHP:
    if (is_dir($path)) {
        if (
    $doh opendir($path)) {
            while(
    $subDir readdir($doh)) { 
                if (!
    preg_match("#^\.\.?$#"$subDir)) {
                    if(
    in_array($subDir,$array_delle_dir)){
                        echo 
    "Si->" $subDir "\n
    "
    ;
                    }
                            }    
            }
        }

    funziona,praticamente mi genera l'albero delle dir che sono REALMENTE presenti,ma non so come applicarlo all'altro script.
    Mi date una mano per favore?
    vi ringrazio come sempre

  2. #2
    un aiutino per favore?

  3. #3
    risolto, in questo modo:
    Codice PHP:
    if (is_dir($path)) {
            foreach (
    $array_delle_dir as $subDir) {
                    if(
    $dh = @opendir($path.$subDir)){
                        if(
    is_dir($path.$subDir)){
                            echo 
    "<a id='menu".$subDir."' href=\"javascript:aprichiudi('$subDir');\">[img]img/cartella_chiusa.jpg[/img]</a>" $subDir"";
                            echo 
    "<div id='".$subDir."' style='display: none; margin-left: 2em;'>";
                            echo 
    "<ul style='list-style:none;text-decoration:none'>\n";
                            while (
    false !== ($file = @readdir($dh))) {
                                if (!
    preg_match("#^\.\.?$#"$file)) {
                                    echo 
    "[*][img]icone/icon_txt.png[/img]REPORT: <a href=\"".$path.$subDir."/".$file."\" onclick=\"window.open(this.href);return false;\">"$file ."</a> - <a href=\"javascript: mailsome1('$file','$subDir');\">Elimina</a>\n";
                                }
                            }
                            echo 
    "[/list]</div>
    \n"
    ;    
                        }
                    }    
                    @
    closedir($dh);
            }

    Il problema era nell'errata posizione di questa porzione di script:
    Codice PHP:
    //prima
    foreach ($array_delle_dir as $dir) {
                                
    /*posizione errata*/
                                
    echo "<a id='menu".$dir."' href=\"java-script:aprichiudi('$dir');\">[img]img/cartella_chiusa.jpg[/img]</a>" $dir"";
                                echo 
    "<div id='".$dir."' style='display: none; margin-left: 2em;'>";
                                echo 
    "<ul style='list-style:none;text-decoration:none'>\n"
                               
    /*posizione errata*/
    if($dh = @opendir($path.$subDir)){
                        if(
    is_dir($path.$subDir)){

    //DOPO
    foreach ($array_delle_dir as $subDir) {
                    if(
    $dh = @opendir($path.$subDir)){
                        if(
    is_dir($path.$subDir)){
                                                   
    /*posizione corretta*/
                            
    echo "<a id='menu".$subDir."' href=\"javascript:aprichiudi('$subDir');\">[img]img/cartella_chiusa.jpg[/img]</a>" $subDir"";
                            echo 
    "<div id='".$subDir."' style='display: none; margin-left: 2em;'>";
                            echo 
    "<ul style='list-style:none;text-decoration:none'>\n";
                                                    
    /*posizione corretta*/ 
    Grazie come sempre

  4. #4
    Utente di HTML.it L'avatar di Grino
    Registrato dal
    Oct 2004
    Messaggi
    739
    Una micro ottimizzazione. Il manuale PHP per la opendir ci dice

    Return Values

    Returns a directory handle resource on success, or FALSE on failure. If path is not a valid directory or the directory can not be opened due to permission restrictions or filesystem errors, opendir() returns FALSE and generates a PHP error of level E_WARNING. You can suppress the error output of opendir() by prepending '@' to the front of the function name.
    quindi il codice

    codice:
    foreach ($array_delle_dir as $subDir) {
        if($dh = @opendir($path.$subDir)){
            if(is_dir($path.$subDir)){
                ...               
            }
        }    
        @closedir($dh);
    }
    Lo puoi scrivere come

    codice:
    foreach ($array_delle_dir as $subDir)
        if(($dh = @opendir($path.$subDir))!==false){        
            ...   
           closedir($dh);                    
        }
    Nel senso che il foreach non ha bisogno del blocco {} perchè esegue solo l'istruzione if, il closedir viene spostato dentro il blocco then dell'if perchè, è inutile cercare di chiudere qualcosa che potrebbe non essere aperto, invece nel blocco then dell'if sei certo che il $dh ha un handle alla directory che chiudi correttamente. Ti risparmi le n chiamate alla funzione is_dir perchè, se la directory viene aperta la usa, altrimenti la ignora.

  5. #5
    ciao Grino, molto gentile...grazie..
    Qui affermi che "il foreach non ha bisogno del blocco {} perchè esegue solo l'istruzione if" quindi ti chiedo: quindi in quale caso si utilizza il blocco {}?

    grazie mille...

  6. #6
    Utente di HTML.it L'avatar di Grino
    Registrato dal
    Oct 2004
    Messaggi
    739
    Citando il manuale PHP

    control-structures intro
    Introduzione

    Qualunque script PHP è costituito di una serie di istruzioni. Una istruzione può essere una assegnazione, una chiamata di funzione, un ciclo, una istruzione condizionale o anche una istruzione che non fa nulla (una istruzione vuota). Le istruzioni di norma terminano con un punto e virgola. In più, le istruzioni possono essere raggruppare in un gruppo-istruzione racchiudendo un gruppo di istruzioni con le parentesi graffe. Un gruppo-istruzioni è essa stessa una istruzione.
    dato che l'istruzione foreach è definita come

    control-structures foreach
    codice:
    foreach (array_expression as $value)
        statement
    foreach (array_expression as $key => $value)
        statement
    consentendo l'esecuzione ciclica di una istruzione e, data la definizione esposta precedentemente, per cui "un gruppo-istruzioni è essa stessa una istruzione", è possibile sostituire alla singola istruzione un gruppo-istruzioni.

    Originariamente nel tuo codice eseguivi due istruzioni, if+closedir, ma dato che ti ho spostato il closedir dentro il gruppo-istruzioni del ramo then dell'istruzione if, l'istruzione if è rimasta la sola ad essere eseguita dal ciclo, da cui le parentesi graffe in tale circostanza diventano superflue.

    Quindi, quando utilizzare le parentesi graffe? Ogni qual volta una struttura di controllo da la possibilità di inserire nei suoi rami una istruzione ma abbiamo necessità di inserirne più di una. In tal caso il gruppo di istruzioni deve essere racchiuso tra parentesi graffe.

    Racchiudere tra parentesi graffe una sola istruzione non è un errore, ma quando inizi a scrivere tanto codice e ti accorgi che 20/30 righe sono di parentesi graffe che si chiudono e che non aggiungono nulla codice, un pensierino sulla loro rimozione ti scappa.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.