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

    Strano comportamento switch

    Ciao a tutti,
    ho un problema in realtà di poco conto, ma che vorrei risolvere:

    in una classe che si occupa della rassegna stampa c'è un metodo che formatta la data: riceve AAAAMMGG e lo trasforma in GG MESEINITALIANO AAAA

    questo metodo è richiamato da numerosi altri metodi, eccolo:
    Codice PHP:
    private function formattaData($data){
                
    //ESTRAPOLO IL MESE IN ITALIANO
                    
    switch(substr($data,4,2)){
                        case 
    01:
                        
    $this->mese="gennaio";
                        break;
                        case 
    02:
                        
    $this->mese="febbraio";
                        break;
                        case 
    03:
                        
    $this->mese="marzo";
                        break;
                        case 
    04:
                        
    $this->mese="aprile";
                        break;
                        case 
    05:
                        
    $this->mese="maggio";
                        break;
                        case 
    06:
                        
    $this->mese="giugno";
                        break;
                        case 
    07:
                        
    $this->mese="luglio";
                        break;
                        case 
    08:
                        
    $this->mese="agosto";
                        break;
                        case 
    09:
                        
    $this->mese="settembre";
                        break;
                        case 
    10:
                        
    $this->mese="ottobre";
                        break;
                        case 
    11:
                        
    $this->mese="novembre";
                        break;
                        case 
    12:
                        
    $this->mese="dicembre";
                        break;
                    }
                    
    // COMPONGO LA DATA
                    
    $data substr($data,6,2)." ".$this->mese." ".substr($data,0,4);
                    return 
    $data;
            } 
    Il metodo funziona perfettamente, tranne che in un caso: una pagina che stampa gli articoli gli passa 20070829 e lui restituisce 29 luglio 2007, in un'altra che usa lo stesso metodo restituisce 29 2007

    Sostanzialmente se il mese è luglio sbaglia, da che cosa può dipendere?

    Grazie!!!

  2. #2
    Non sembra esserci nessun problema nel tuo codice (tra l'altro dici che viene utilizzato anche in altri punti).
    Comunque più che uno switch io utilizzerei un array:

    Codice PHP:
    <?php
    class {
    private 
    $mesi = array(
        
    '01' => 'gennaio'
        
    '02' => 'febbraio'
        
    '03' => 'marzo'
        
    '04' => 'aprile'
        
    '05' => 'maggio'
        
    '06' => 'giugno'
        
    '07' => 'luglio'
        
    '08' => 'agosto'
        
    '09' => 'settembre'
        
    '10' => 'ottobre'
        
    '11' => 'novembre'
        
    '12' => 'dicembre'
    );

    public function 
    formattaData($data) {
        
    $data substr($data62)." ".$this->mesi[substr($data42)]." ".substr($data04);
        return 
    $data;
    }

    }

    $a = new A();
    echo 
    $a->formattaData('20070829');
    ?>
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  3. #3
    Già, più logico e meno codice

    Così funziona e te ne sono grato,
    ma mi chiedo: perché non gli piaceva agosto??? Per il caldo?

  4. #4
    Utente di HTML.it L'avatar di clasku
    Registrato dal
    Aug 2006
    Messaggi
    3,197
    lo fa sia su agosto sia su settembre
    il motivo non lo so, ma se racchiudi il mese nel case tra doppi apici funziona correttamente

    Codice PHP:
    private function formattaData($data){
    //ESTRAPOLO IL MESE IN ITALIANO
        
    switch(substr($data,4,2)){
            case 
    "01":
            
    $this->mese="gennaio";
            break;
    //[...] 

  5. #5
    lo fa sia su agosto sia su settembre
    il motivo non lo so, ma se racchiudi il mese nel case tra doppi apici funziona correttamente
    Ok, ma per puro ragionamento, se io lo chiudo fra doppi apici lo rendo una stringa...
    Oppure il problema sta proprio lì, che effettivamente substr restituisce una stringa...

    Che dite, potrebbe essere?

  6. #6
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Originariamente inviato da clasku
    lo fa sia su agosto sia su settembre
    Perché 08 e 09 sono numeri che non esistono.
    I casi sono due: o quel dato è numerico, o è una stringa. Se è una stringa ci metti quello che vuoi, ma lo metti fra apici. Se è un numero, lo zero davanti non ci va: primo perché, generalmente parlando, non serve a niente, e secondo perché i calcolatori lo interpretano come numero ottale, per cui quando si trovano davanti 08 o 09 non sanno che farsene.

  7. #7
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Originariamente inviato da lorenzos
    Ok, ma per puro ragionamento, se io lo chiudo fra doppi apici lo rendo una stringa...
    Oppure il problema sta proprio lì, che effettivamente substr restituisce una stringa...

    Che dite, potrebbe essere?
    Esatto, substr() restituisce una stringa. Se la confronti con un numero, php cerca di fare le conversioni a modo suo, ma si scontra con quello che ho scritto qui sopra

  8. #8
    Utente di HTML.it L'avatar di clasku
    Registrato dal
    Aug 2006
    Messaggi
    3,197
    ottima spiegazione, ero arrivato al fatto che non considerasse realmente "06" o "08" (senza apici) come numeri ma non avevo considerato la questione "ottale", grazie

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.