2016-03-22 10 views
3

Ich schreibe einen einfachen Morse-Code-Konverter in PHP, der eine Zeichenfolge nehmen und in Morse-Code konvertieren kann. Es verwendet ein assoziatives Array, eine foreach-Schleife und eine for-Schleife. Es funktioniert, außer aus irgendeinem Grund gibt es den Morse-Code gleich für "0" nach jedem konvertierten Zeichen aus. Ich kann nicht herausfinden, woher die 0 kommt. Wenn ich 0 aus dem assoziativen Array entferne, gibt es kein Problem, aber ich möchte auch Zahlen konvertieren können. Wenn jemand mir ein Feedback geben kann, wäre das sehr zu begrüßen.PHP Morse-Code-Konverter

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/>"; 
      } 
     } 
    } 
?> 
+1

konnten Sie das Skript oben erstellen. Ich sehe keinen Grund, warum Sie das nicht durchziehen sollten. Es ist nur eine Zeichenfolge Manipulation. Ich will dir zwar helfen, aber du musst deine Hausaufgaben machen. : D –

Antwort

4

Das Hauptproblem ist, dass Sie „mehr“ als nötig tun. Es besteht keine Notwendigkeit, Ihre $assoc_array so zu durchlaufen, wenn Sie die Zeichenfolge verwenden können, um die benötigten Daten von ihr zu holen.

Dies verbraucht auch weniger Ressourcen, da Sie anstelle von a-z und 0-9 nur die exakte Anzahl der benötigten Buchstaben/Zahlen/Leerzeichen loopen.

/*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';  
} 

Da Ihr Array enthält alles, was von a-z und 0-9 können Sie einfach nur die gewünschten Buchstaben nennen, ohne sich um fehlende Daten besorgniserregend.

Edit: Added ein isset() Scheck, wird es kaum benötigt werden, da die $assoc_array jeden benötigten Buchstaben/Zahlen bedeckt, aber sicher ist sicher. (Kredit zu @Farkie für mich zu erinnern)

+0

Sie sollten überprüfen, dass $ string_lower [$ i] zuerst existiert – Farkie

+0

@Farkie Ja, könnte man argumentieren, aber da OP hat so ziemlich jeden Buchstaben/Nummer abgedeckt gibt es kaum eine Chance, dass es nicht gesetzt ist/dort, aber leider, Du hast recht und ich werde meine Antwort darauf ändern. (Ich nehme an, du meinst, dass '$ string_lower [$ i]' in '$ assoc_array' existiert) – Epodax

+0

Danke, das macht viel mehr Sinn! Ich denke, der Grund, warum ich eine foreach-Schleife verwendet habe, war, weil ich nicht dachte, dass ich Indexierung mit einem assoziativen Array verwenden könnte (ich dachte, ich könnte nur auf seinen Schlüssel verweisen), also habe ich eine foreach-Schleife verwendet, um jeden Wert durchzugehen ein und über komplizieren es. Ich bin mir nicht sicher, woher ich diese Idee habe, aber ich bin froh, dass ich mich jetzt geklärt habe. Danke noch einmal! – 8se7en

2

Die einfachste Fix ist einfach ein 'Bruch' nach dem Echo hinzuzufügen:

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

Das eigentliche Problem ist, dass die 0 bis falsch auswertet, was bedeutet, dass wenn es über es läuft, es ein truthy (falsch == falsch) wird.

Sie können es noch besser lösen, indem ein identisches (===) Spiel zu tun:

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

Danke! Es hat mich verrückt gemacht, aber jetzt kann ich sehen, was ich vermisst habe. – 8se7en

1

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

können Vermeidung all diese hässlichen für Schleifen und Vereinfachung der Code eine ganze Menge:

$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              
// -..-----.