5

文字列を取り、それをモールス符号に変換できる基本的なモールス符号コンバーターを PHP で作成しています。連想配列、foreach ループ、および for ループを使用しています。何らかの理由を除いて、変換された各文字の後に「0」に相当するモールス信号を出力します。0がどこから来ているのかわかりません。連想配列から0を外せば問題ないのですが、数値も変換できるようにしたいです。誰かが私にフィードバックを与えることができれば、それは大歓迎です.

コードは次のとおりです。

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

4 に答える 4

5

主な問題は、必要以上に「多く」を行っていることです。$assoc_array文字列を使用して必要なデータを取得できる場合は、ループする必要はありません。

これは、ループする代わりに、必要な文字/数字/スペースの正確な量だけをループするため、使用するリソースも少なくa-zなります。0-9

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

配列にはすべてが含まれているため、a-zデータ0-9の欠落を心配することなく、必要な文字を簡単に呼び出すことができます。

編集:チェックを 追加しました。必要なすべての文字/数字をカバーするisset()ため、ほとんど必要ありませんが、申し訳ありませんが安全です。$assoc_array(思い出させてくれた@Farkieの功績)

于 2016-03-22T09:16:29.310 に答える