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