2017-04-04 99 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

它是一个有趣的问题。我将它分成两个功能,一个编码器和一个解码器。它们都有相同的数组,我们从一个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