PHP-Morse-code-Konverter

Ich Schreibe eine basic-morse-code-Konverter in PHP, die eine Zeichenkette und wandelt Sie in morse-code. Es ist mit ein assoziatives array mit einer foreach-Schleife und eine for-Schleife. Es funktioniert, außer für einige Grund es gibt das morse-code-Entsprechung für ‚0‘ nach jeder konvertierten Charakter ein. Ich kann nicht herausfinden, wo die 0 herkommt. Wenn ich entfernen 0 aus dem assoziativen array, ist es kein problem, aber ich möchte in der Lage sein, zu konvertieren, zahlen ebenso. Wenn jemand in der Lage ist zu geben mir feedback, dass wäre sehr geschätzt werden.

Hier ist der code:

<?php
$string = "dog";
$string_lower = strtolower($string);
$assoc_array = array(
    "a"=>".-",
    "b"=>"-...", 
    "c"=>"-.-.", 
    "d"=>"-..", 
    "e"=>".", 
    "f"=>"..-.", 
    "g"=>"--.", 
    "h"=>"....", 
    "i"=>"..", 
    "j"=>".---", 
    "k"=>"-.-", 
    "l"=>".-..", 
    "m"=>"--", 
    "n"=>"-.", 
    "o"=>"---", 
    "p"=>".--.", 
    "q"=>"--.-", 
    "r"=>".-.", 
    "s"=>"...", 
    "t"=>"-", 
    "u"=>"..-", 
    "v"=>"...-", 
    "w"=>".--", 
    "x"=>"-..-", 
    "y"=>"-.--", 
    "z"=>"--..", 
    "0"=>"-----",
    "1"=>".----", 
    "2"=>"..---", 
    "3"=>"...--", 
    "4"=>"....-", 
    "5"=>".....", 
    "6"=>"-....", 
    "7"=>"--...", 
    "8"=>"---..", 
    "9"=>"----.",
    "."=>".-.-.-",
    ","=>"--..--",
    "?"=>"..--..",
    "/"=>"-..-.",
    " "=>" ");
    for($i=0;$i<strlen($string_lower);$i++){
        foreach($assoc_array as $letter => $code){
            if($letter == $string_lower[$i]){
                echo "$code<br/>";
            }
        }
    }
?>
  • Sie waren in der Lage, erstellen Sie das Skript oben. Ich sehe keinen Grund, warum sollten Sie nicht in der Lage zu ziehen, dass off. Es ist nur eine string-manipulation. Obwohl ich wan ‚ T um Ihnen zu helfen, aber Sie müssen Ihre Hausaufgaben machen. 😀
InformationsquelleAutor 8se7en | 2016-03-22



4 Replies
  1. 4

    Das Hauptproblem ist, dass Sie tun, „mehr“ als nötig. Es gibt keine Notwendigkeit, um eine Schleife durch Ihre $assoc_array wie, dass, wenn Sie können, verwenden Sie die Zeichenfolge, um das abrufen der benötigten Daten aus.

    Diese auch verwendet weniger Ressourcen, als anstatt einer Schleife aus a-z und 0-9 Sie nur Schleife die genaue Höhe der Buchstaben /zahlen /Leerzeichen erforderlich.

    /*Rest of your code above*/
    for($i=0;$i<strlen($string_lower);$i++){
        echo (isset($assoc_array[$string_lower[$i]])) ? $assoc_array[$string_lower[$i]] . '<br />' : 'ERROR';       
    } 

    Seit Ihr array enthält alles, was aus a-z und 0-9 Sie können ganz einfach, rufen Sie den gewünschten Buchstaben, ohne sich sorgen über fehlende Daten.

    Edit:
    Hinzugefügt isset() prüfen, wird es kaum erforderlich sein, da die $assoc_array deckt alle benötigten Buchstaben /Zahl, aber better safe than sorry. (Kredit @Farkie mich daran erinnert)

    • Sie sollten überprüfen, dass die $string_lower[$i] existiert, ersten
    • Ja, man könnte argumentieren, dass, aber seit der OP hat so ziemlich jeder Buchstabe / Zahl bedeckt, es gibt kaum eine chance, dass es nicht gesetzt / vorhanden ist, aber leider, Sie haben Recht und ich ändere meine Antwort. (Ich nehme an, du meinst überprüfen Sie, dass $string_lower[$i] existieren in der $assoc_array)
    • Danke, das macht viel mehr Sinn! Ich denke, der Grund, warum ich verwendet eine foreach-Schleife, weil ich nicht glaube, ich könnte eine Indizierung nutzen, die mit einer assoziativen Arrays (ich dachte, ich könnte beziehen sich nur auf seine Schlüssel), so war ich mit einer foreach-Schleife Durchlaufen, jeden Wert einzeln und über erschwerend. Ich bin mir nicht sicher, wo ich die Idee aus, aber ich bin froh, habe ich gelöscht, bis jetzt. Nochmals vielen Dank!
    • Ich werden das hinzufügen von code, um zu überprüfen, dass die $string_lower[$i] existiert, zuerst aber an diesem Punkt war ich einfach nur versuchen, um die Grundlagen der Arbeit und gehen von dort aus. Die meisten der Buchstaben/zahlen enthalten, in das array.
  2. 2

    Die einfachste Lösung ist einfach zu fügen Sie eine ‚Pause‘ nach dem echo:

    foreach($assoc_array as $letter => $code){
                    if($letter == $string_lower[$i]){
                            echo "$code<br/>";
                            break;
                    }
            }

    Das eigentliche problem ist, dass der 0 ist die Auswertung zu false, was bedeutet, dass, wenn es eine Schleife über Sie, es geht um ein truthy (false == false).

    Lösen können Sie es noch besser, indem Sie eine identische (===) match:

    foreach($assoc_array as $letter => $code){
                    if($letter === $string_lower[$i]){
                            echo "$code<br/>";
                            break;
                    }
            }
    • Danke!!! Es fuhr mich verrückt, aber jetzt kann ich sehen, was ich fehlte.
  3. 1

    Können Sie auch ein bisschen php funktionalen Programmierung, wie die array_reduce() Funktion http://php.net/manual/en/function.array-reduce.php

    Vermeiden alle diese hässlichen Schleifen und code vereinfacht einiges:

    $convert = function($carry, $item) {
        $table = array(
            "a" => ".-",
            "b" => "-...",
            "c" => "-.-.",
            "d" => "-..",
            "g" => "--.",
            "o" => "---");
        //Get the correspondent value for the given letter
        $morse = $table[$item];
        //Return the string with appended morse character
        return $carry . $morse;
    };
    
    //Split 'dog' into an array, then apply a reduce to convert it to morse
    array_reduce(str_split('dog'), $convert);
    //➜  ~ php morse.php                                                     
    //-..-----.
  4. 0

    Ich weiß, es ist schon eine Weile her, die Frage wurde gepostet und die Antworten erhalten. Ich dachte, ich würde hinzufügen mit dieser Funktion schrieb ich für Menschen, die finden, diese Frage in der Zukunft.

    Code

    /**
     * Convert string to morse
     *
     * @param string $string
     * @return string
     */
    function str_to_morse(string $string) {
        //Make the string lowercase and create an array of the characters
        $stringParts = str_split(strtolower($string));
    
        //Define the dictionary
        $morseDictionary = [
            'a' => '.-',
            'b' => '-...',
            'c' => '-.-.',
            'd' => '-..',
            'e' => '.',
            'f' => '..-.',
            'g' => '--.',
            'h' => '....',
            'i' => '..',
            'j' => '.---',
            'k' => '-.-',
            'l' => '.-..',
            'm' => '--',
            'n' => '-.',
            'o' => '---',
            'p' => '.--.',
            'q' => '--.-',
            'r' => '.-.',
            's' => '...',
            't' => '-',
            'u' => '..-',
            'v' => '...-',
            'w' => '.--',
            'x' => '-..-',
            'y' => '-.--',
            'z' => '--..',
            '0' => '-----',
            '1' => '.----',
            '2' => '..---',
            '3' => '...--',
            '4' => '....-',
            '5' => '.....',
            '6' => '-....',
            '7' => '--...',
            '8' => '---..',
            '9' => '----.',
            '.' => '.-.-.-',
            ',' => '--..--',
            '?' => '..--..',
            '/' => '-..-.',
            ' ' => ' ',
        ];
    
        $morse = '';
        foreach ($stringParts as $stringPart) {
            if (array_key_exists($stringPart, $morseDictionary)) {
                $morse .= $morseDictionary[$stringPart] . '<br />';
            }
        }
    
        return $morse;
    }

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.