Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    refactoring di questa porzione di codice

    Premetto che non sono un programmatore ma un grafico che si sta cimentando con il php quindi mi scuso se posso essere banale nel codice che riporto:

    Codice PHP:
    $myVar "<table id='forecast'>
                <tr>
                    <th scope='col' class='spots'>Città</th>
                    <th scope='col' class='colwth'>Tempo</th>
                    <th scope='col' class='coln'>Min</th>
                    <th scope='col' class='colx'>Max</th>
                </tr>
                <tr>
                    
                    <th scope='row' class='spot'>[url='http://www.meteogiornale.it']<span style='display: inline;'>Venerd&igrave;</span>[/url]</th>
                    <td class='img'>[url='http://www.meteogiornale.it']<span style='display: inline;'><img src=\"http://www.tempoitalia.it/icone_meteo/meteocitta30/giorno/sereno.png\" width=\"30\" height=\"30\" alt=\"sereno\" /></span>[/url]</td>
                    <td class='tmin'>23</td>
                    <td class='tmax'>33</td>
                </tr>
                <tr>
                    
                    <th scope='row' class='spot'>[url='http://www.meteogiornale.it']<span style='display: inline;'>Sabato</span>[/url]</th>
                    <td class='img'>[url='http://www.meteogiornale.it']<span style='display: inline;'><img src=\"http://www.tempoitalia.it/icone_meteo/meteocitta30/giorno/sereno.png\" width=\"30\" height=\"30\" alt=\"sereno\" /></span>[/url]</td>
                    <td class='tmin'>21</td>
                    <td class='tmax'>30</td>
                </tr>
                <tr>
                    
                    <th scope='row' class='spot'>[url='http://www.meteogiornale.it']<span style='display: inline;'>Domenica</span>[/url]</th>
                    <td class='img'>[url='http://www.meteogiornale.it']<span style='display: inline;'><img src=\"http://www.tempoitalia.it/icone_meteo/meteocitta30/giorno/quasi_sereno.png\" width=\"30\" height=\"30\" alt=\"quasi sereno\" /></span>[/url]</td>
                    <td class='tmin'>19</td>
                    <td class='tmax'>32</td>
                </tr>
            </table>"
    ;
     
            
    $doc = new DOMDocument;
            
    $doc->loadHTML($myVar);
            
            
    $xpath = new DOMXPath($doc);
            
            
    $span        $xpath->query('//span');
            
    $img         $xpath->query('//img[@width="30"]');
            
    $min         $xpath->query('//td[@class="tmin"]');
            
    $max         $xpath->query('//td[@class="tmax"]');
            

            foreach (
    $span as $span){
                if ( !empty(
    $span->nodeValue) ){
                    
    $giorno[] = $span->nodeValue;
                }
    #            echo $giorno."
    ";    
            }        

        
            foreach (
    $min as $min){
                
    $minima[] = $min->nodeValue;
    #            echo 
    $minima."
    ";            
            }
            
            foreach (
    $img as $img){
                
    $icona[] = $img->getAttribute('src');
                
    $alt[]   = $img->getAttribute('alt');
    #            echo 
    $icona."
    ";            
            }

            foreach (
    $max as $max){
                
    $massima[] = $max->nodeValue;
    #            echo 
    $massima."
    ";            
            }
            
            for( 
    $i = 0; $i <= 2; $i++){            
                echo 
    $alt[$i].'[img]'.$icona[$i].'[/img]'.$giorno[$i].''.$minima[$i].''.$massima[$i].'
    '."
    \n";
            }
    #        print_r(
    $giorno);
    #        print_r(
    $minima);
    #        print_r(
    $massima); 
    Il mio dubbio è se ci sia un modo più snello e\o professionale per avere lo stesso risultato, magari risparmiando qualche foreach.

    Grazie in anticipo
    °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
    Una terza abbondante (.)(.) non
    è mai una quarta! ( o )( o )
    °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°

  2. #2
    Non so cosa dirti sullo snello, il codice e' molto chiaro ed ordinato.

    Il primo appunto che ti faccio e' l' ultimo for: utilizza un dato che sai a priori ciclando tre volte l' array; immagina di volere usare il codice senza sapere a priori il contenuto del dom.

    Il secondo appunto e' che ti devi fidare della correttezza del dom: se ci fosse qualche omissione potresti avere i tuoi 5 array con un numero diverso di elementi, avresti di sicuro un errore ma se anche non lo avessi ti ritroveresti con i dati disallineati.

    Il terzo piu che un appunto e' un dubbio: non dovresti mettere il controllo if ( !empty($span->nodeValue) ) anche negli altri cicli for?


    Per migliorare il tuo codice dovresti fare cosi:
    Caricare con DOMXPath in una variabile tutti i nodi <tr> che hanno un child <span> ( anche vuoto )
    ciclare su tutti i nodi trovati; in ogni ciclo assegni una variabile con il valore dei 5 attributi che ti servono (xpath dovrebbe consentirti di fare query sul nodo corrente del ciclo)
    converti i nulli come preferisci
    alla fine di ogni iterazione del ciclo utilizzi le variabili per generare l' output
    Nella vita c'e' sempre da imparare, c'e' chi impara a fare e chi impara ad aspettare.

  3. #3
    Grazie mille per la risposta.

    Il file è un .txt che viene generato da un servizio di meteo online ed il template è fisso per quello non mi sono fatto problemi nell'impostare da subito il numero di cicli del for, ho la certezza che il file è quello e non cambia se non nei dati.


    Il controllo l'ho messo solamente a quell'elemento perchè solo quell'array a volte mi tirava fuori degli elementi vuoti e non capivo perchè e quindi ho rattoppato con quel controllo.


    Per l'ultima parte dei tuoi consigli me la studio e vedo come implementarla.

    Grazie ancora!

    Edit
    Ho eliminato il controllo con l'IF sostituendo il selettore nella query
    Codice PHP:
            $span        $xpath->query('//th/a'); 
    °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
    Una terza abbondante (.)(.) non
    è mai una quarta! ( o )( o )
    °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°

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 © 2025 vBulletin Solutions, Inc. All rights reserved.