2017-04-04 13 views
2

私は学校のためのPHPモールスエンコーダとデコーダを作っています。
すでにエンコーダが動作していますが、デコーダを動作させる方法を理解できません。

以下のコードは私のデコーダ用のものです。
私は、コードで文字を切り替えることによってデコーダを私のエンコーダと同じにしようとしました。 モールス文字を混乱させ、それらをマージするので、それはうまくいかなかった。

だから私はまず、デコーダに入れられた文字をそれぞれ配列に入れて別々にデコードし、最後に一緒に戻す必要があると思います。

私はたくさんのものを試しましたが、実際に何をしているのか分からず、私はそれを理解できません。
私はPHPには新しいので、できるだけシンプルにしています。
ご協力いただきありがとうございます。PHPモールスデコーダでスタック

<?php 
$break = "<br>" ; 
$Words = $_POST['morse2']; 

//get the morse, seperate each letter and then decode and echo the outcome 

$seperation = explode(" ", $Words); 
var_dump($seperation) ; 
echo $break ; 

// foreach($seperation){ 
// str_replace("/ "," ",$seperation); 
// } 
$seperation = str_replace("/ "," ",$Words); 
$seperation = str_replace(".- ","a",$Words); 
$seperation = str_replace("-... ","b",$Words); 
$seperation = str_replace("-.-. ","c",$Words); 
$seperation = str_replace("-.. ","d",$Words); 
$seperation = str_replace(". ","e",$Words); 
$seperation = str_replace("..-. ","f",$Words); 
$seperation = str_replace("--. ","g",$Words); 
$seperation = str_replace(".... ","h",$Words); 
$seperation = str_replace(".. ","i",$Words); 
$seperation = str_replace(".--- ","j",$Words); 
$seperation = str_replace("-.- ","k",$Words); 
$seperation = str_replace(".-.. ","l",$Words); 
$seperation = str_replace("-- ","m",$Words); 
$seperation = str_replace("-. ","n",$Words); 
$seperation = str_replace("--- ","o",$Words); 
$seperation = str_replace(".--. ","p",$Words); 
$seperation = str_replace(".-. ","r",$Words); 
$seperation = str_replace("... ","s",$Words); 
$seperation = str_replace("- ","t",$Words); 
$seperation = str_replace("..- ","u",$Words); 
$seperation = str_replace("...- ","v",$Words); 
$seperation = str_replace("-.-- ","y",$Words); 
$seperation = str_replace("--.. ","z",$Words); 
$seperation = str_replace("--.- ","q",$Words); 
$seperation = str_replace(".-- ","w",$Words); 
$seperation = str_replace("-..- ","x",$Words); 

$seperation = str_replace(".---- ","1",$Words); 
$seperation = str_replace("..--- ","2",$Words); 
$seperation = str_replace("...-- ","3",$Words); 
$seperation = str_replace("....- ","4",$Words); 
$seperation = str_replace("..... ","5",$Words); 
$seperation = str_replace("-.... ","6",$Words); 
$seperation = str_replace("--... ","7",$Words); 
$seperation = str_replace("---.. ","8",$Words); 
$seperation = str_replace("----. ","9",$Words); 
$seperation = str_replace("----- ","0",$Words); 

echo $seperation; 

    /*Here's a tiny piece of my encoder to show you how i did that 
    basically the same as the decoder, real simple. 
    $Words = $_POST['morse']; 
    $Words = str_replace(" ","/ ",$Words); 
    $Words = str_replace("a",".- ",$Words); 
    $Words = str_replace("b","-... ",$Words); 
    $Words = str_replace("c","-.-. ",$Words); 
    echo $Words; 
    /* 
?> 
+2

だろう。あなたは '$ _POST ['morse2']'に何を渡していますか? – bowl0stu

+1

可能な回答が多すぎるか、この回答の回答が長すぎます。回答セットを絞り込むか、いくつかの段落で回答できる問題を特定するための詳細を追加してください。私は一般的な問題を解決するための開発フォーラム(おそらく[Quora](http://www.quora.com/Computer-Programming))を見つけることをお勧めします。次に、特定のコーディングの問題がある場合は、Stack Overflowに戻ってください。お手伝いします。 –

+1

*「最初にデコーダに入れられた文字をそれぞれ配列に入れて別々にデコードし、最後に一緒に戻す必要があると思う」*これは完璧なアプローチのように聞こえる。これを試したときに何が失敗したのですか? –

答えて

3

これは興味深い質問です。私はそれを2つの関数、すなわちエンコーダとデコーダに分割しました。彼らはどちらも同じ配列を持っています。これはget_morse()関数から得られます(私はこれを別の関数に分割してより少ない行にするだけです)。 get_morse()には、各モールス符号の後にスペースがあるため、エンコードする際に乱雑になりません。 trim()でそれを簡単に整理することができます(文字列をスペースで区切って各コードが表す文字を取得するので)。

function get_morse() { 
    return 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" => "--** "); 
} 

は、エンコーダは、それが基本的に値が入っているそれぞれのモールス符号を有する各文字(モールスアレイにおける鍵である)(置き換え

function morse_encoder($word) { 
    return str_replace(array_keys(get_morse()), get_morse(), strtolower($word)); 
} 

非常に簡単ですアレイ)。したがって、配列に'a' => "*- "があり、すべての文字(キー)が配列の値で置き換えられます。

デコーダはおそらくいくつかのarray_*機能でさらに簡素化することができますが、これは正しく機能し、正しくデコードします。以前と同じ配列を使用します(get_morse()から)。

function morse_decoder($word) { 
    $morse = array_map("trim", get_morse()); 
    $output = ""; 
    foreach (explode(" ", $word) as $value) { 
     $output .= array_search($value, $morse); 
    } 
    return strtoupper($output); 
} 

エンコードされた文字列をスペースで区切ってみると、個々のモールス符号をそれぞれの要素として持つ配列が得られます。これをループして、エンコード時に行った処理を「逆」にすることができます。モールス符号と一致する配列内の各要素を見つけ出し、それをそのキーで置き換える。これは適切な手紙です。これらの機能の

使い方は、これは興味深いプロジェクトである

echo morse_encoder("sos");   // Output: *** --- *** 
echo morse_decoder("*** --- ***"); // Output: SOS 

Live demo

+0

素敵な仕事の男、ありがとう! それを試してみましょう。 – mango

+0

あなたが必要としていることを望み、別のアプローチであなたの問題がどのように解決できるかを見てください。これがあなたの問題を解決したら、[回答を受け入れてください](http://stackoverflow.com/help/accepted-answer)ので、将来の読者にこれがあなたの問題の解決に役立ったことを知らせてください! – Qirel

+0

申し訳ありませんが、私はここに新しいです:p 私はあなたの助けをお寄せいただきありがとうございます! – mango

関連する問題