Visualizzazione dei risultati da 1 a 10 su 10

Discussione: Semplice traduttore

  1. #1
    Utente di HTML.it L'avatar di gabar-el
    Registrato dal
    Jun 2006
    Messaggi
    2,222

    Semplice traduttore

    Ciao, vorrei realizzare un piccole traduttore (si tratta solo di un esercizio).
    Ho creato un dizionario e un testo di esempio come input. Ma navigo in alto mare. Non capisco come potere fare riferimento al dizionario prendendo però le parole inserite in input.

    Codice PHP:
    <?php
        $dizio 
    = array ('albero' => 'tree',
                             
    'barca' => 'boat',
                             
    'casa' => 'home',
                             
    'dare' => 'give',
                             
    'essere' => 'be',
                             
    'fare' => 'do',
                             
    'giocare' => 'play',
                             
    'io' => 'I',
                             
    'avere' => 'have',
                             
    'domani' => 'tomorrow');
        
    $input 'io giocare casa domani';
        
    $testo explode(' ',$input);
        while(list(
    $key,$value) = each($dizio)) {
            echo 
    $value[$testo];
        }
    ?>
    Così ottengo qualche lettera che però sinceramente non so nemmeno da dove venga prelevata.
    Si fanno sempre nuove scoperte

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    719

    Re: Semplice traduttore

    Devi creare il ciclo per le parole, non per il dizionario.
    E poi ti consiglio di usare un foreach.
    Codice PHP:
    <?php
        $dizio 
    = array ('albero' => 'tree',
                             
    'barca' => 'boat',
                             
    'casa' => 'home',
                             
    'dare' => 'give',
                             
    'essere' => 'be',
                             
    'fare' => 'do',
                             
    'giocare' => 'play',
                             
    'io' => 'I',
                             
    'avere' => 'have',
                             
    'domani' => 'tomorrow');
        
    $input 'io giocare casa domani';
        
    $testo explode(' ',$input);
            
    $output '';
            foreach(
    $testo as $parola){
                
    $output .= ($k=array_search($parola$dizio))!==false?$dizio[$k]:$parola;
            }
    ?>
    Ora dovrebbe andare.



  3. #3
    Utente di HTML.it L'avatar di gabar-el
    Registrato dal
    Jun 2006
    Messaggi
    2,222
    Mi rende la frase sempre in italiano e non ci sono spazi tra una parola e l'altra.
    Non mi è chiaro ciò che hai fatto qui:
    Codice PHP:
     $output .= ($k=array_search($parola$dizio))!==false?$dizio[$k]:$parola
    me lo potresti spiegare?
    Grazie
    Si fanno sempre nuove scoperte

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    719
    Scusami, ho toppato completamente.

    Codice PHP:
    $output .= isset($dizio[$parola])?$dizio[$parola]:$parola;
    $output .= " "
    Questo è meglio.

    Allora

    E' tutto un operatore ternario.
    condizione ? true : false

    Si comporta quindi come un if:

    Codice PHP:
    if(condizione){
    true
    }else{
    false

    Di conseguenza se volessi "trascriverlo" in if diventa:

    Codice PHP:
    if(isset($dizio[$parola])){
    $dizio[$parola];
    }else{
    $parola;

    Quello che usavo io è inutile, non lo cosiderare...



  5. #5
    Utente di HTML.it L'avatar di gabar-el
    Registrato dal
    Jun 2006
    Messaggi
    2,222
    Così funziona perfettamente. Grazie.
    Codice PHP:
    $testo explode(' ',$input);
       foreach(
    $testo as $parola) {
           
    $output .= isset($dizio[$parola])?$dizio[$parola]:$parola;
           
    $output .= ' ';
       }
       echo 
    $output
    Ci sono alcune cose però che non capisco:
    perché dentro al foreach la variabile output necessita di .= e non solo di =
    Ho provato a togliere il punto e mi restituisce solo l'ultima parola (tomorrow), ma non riesco a capire per quale motivo. Siamo dentro a un ciclo e quindi deve ciclare ogni volta la parola da aggiungere al valore della variabile output?

    Il ternario mi è chiaro, ma non capisco come lo fai lavorare. L'indice $parola dell'array $dizio che valore va a prendere? Come può tornare il valore e non la chiave? Fatico un po' a comprendere questo.
    Si fanno sempre nuove scoperte

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    719
    Ok, intanto che conoscenze hai con gli operatori?
    + , - , * , / , % e così via.
    Il . fa parte degli operatori e serve per concatenare. In pratica se io ho 2 strighe e le voglio unire faccio:
    $stringa = $stringa1.$stringa2;

    Metterlo prima dell'uguale vuol dire farlo diventare operatore di assegnamento.
    $stringa = "Ciao ";
    $stringa .= "gabar-el";

    Ora il valore della stringa sarà: "Ciao gabar-el".

    Invece senza usare il ., quindi solo =, il secondo valore che dai alla variabile sostituisce il primo.


    Invece per gli array tu sai che per richiamarne un valore di un array si usa $array[0]
    Puoi usare invece del numero anche una stringa: $array['ciao'] e puoi usare anche una variabile: $array[$var]
    In pratica quando usi una variabile php cerca nel tuo array il valore della variabile che dai.
    Faccio un esempio pratico:

    Codice PHP:
    $array = array('nome' => 'gabar-el');
    $var 'nome';
    $nome $array[$var]; 
    Quindi ora $nome sarà "gabar-el".

    Nel foreach prendo l'array $testo e pongo ogni suo elemento con $parola. Infatti "for each" vuol dire "per ognuno", quindi tradotto in italiano diventa:

    PER OGNI ELEMENTO DI $testo CHIAMATO $parola:

    Volendo si può anche usare un while:

    Codice PHP:
    while(list($k,$parola) = each($testo)) {
    $output .= isset($dizio[$parola])?$dizio[$parola]:$parola;
    $output .= ' '

    Ma diventa diventa più complicato scriverlo.
    E' più utile usare un while quando devi fetchare i risultati di mysql.


    Spero di essere stato chiaro.


  7. #7
    Utente di HTML.it L'avatar di gabar-el
    Registrato dal
    Jun 2006
    Messaggi
    2,222
    Con gli operatori ci sono e sei stato anche molto chiaro.
    Forse non mi sono spiegato benissimo. Ciò che intendevo: perché questo output
    Codice PHP:
    $output .= isset($dizio[$parola])?$dizio[$parola]:$parola
    ha bisogno del punto davanti all'uguale?
    Perché siamo in un ciclo e quindi non riesco a differenziare il primo valore restituito da quelli seguenti?
    Il primo valore restituito non avrebbe bisogno del punto giusto?
    Spero di avere chiarito il mio quesito.

    ps: sicuro il . sia un operatore? A mio avviso no.
    Grazie
    Si fanno sempre nuove scoperte

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    719
    Programmo in php da anni ormai quindi non posso sbagliarmi sugli operatori. Il . come già ti avevo detto è operatore di concatenamento, serve a concatenare 2 stringhe.
    Quindi scrivere:

    $output = $output . "\n";

    E' la stessa cosa di scrivere:

    $output .= "\n";


    In pratica mettere .= vuol dire concatenare alla stringa un'altra stringa e mettere il risultato dell'operazione nella prima stringa.

    Se vuoi approfondire:
    http://it.php.net/manual/en/language.operators.php

  9. #9
    Utente di HTML.it L'avatar di gabar-el
    Registrato dal
    Jun 2006
    Messaggi
    2,222
    Non sto mettendo in dubbio la funzionalità del punto. Volevo solo dire che il . non è un operatore logicio, ma un operatore di stringa. Che concateni non c'è alcun dubbio, ma forse non hai ben compreso la mia domanda circa la variabile $output.
    La prima volta che il ciclo passa per la variabile $output .=... non avrebbe bisogno in teoria del punto di concatenamento perché non deve concatenare nulla. Solo dal secondo passaggio necessita di concatenare. Sbaglio?
    Si fanno sempre nuove scoperte

  10. #10
    Originariamente inviato da gabar-el
    La prima volta che il ciclo passa per la variabile $output .=... non avrebbe bisogno in teoria del punto di concatenamento perché non deve concatenare nulla. Solo dal secondo passaggio necessita di concatenare. Sbaglio?
    Gia', ma visto che la riga dentro il ciclo la scrivi una volta sola, allora devi usare la versione che funzioni sia al primo giro che ai successivi.

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.