Php 莫尔斯码转换器

Php 莫尔斯码转换器,php,arrays,loops,converter,morse-code,Php,Arrays,Loops,Converter,Morse Code,我正在用PHP编写一个基本的莫尔斯电码转换器,它可以将字符串转换成莫尔斯电码。它使用关联数组、foreach循环和for循环。它可以工作,除非出于某种原因,它在每个转换字符后输出与“0”等效的摩尔斯电码。我不知道0是从哪里来的。如果从关联数组中删除0,则没有问题,但我希望能够转换数字。如果有人能给我一些反馈,我将不胜感激 代码如下: <?php $string = "dog"; $string_lower = strtolower($string); $assoc_array = arra

我正在用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/>";
            }
        }
    }
?>

最简单的修复方法是在回音后添加“中断”:

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

主要的问题是你做的“太多”了。当您可以使用字符串从中获取所需的数据时,无需像这样在
$assoc\u数组中循环

这也使用了较少的资源,因为与从
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';       
} 
/*以上代码的其余部分*/

对于($i=0;$i您还可以使用一些php函数编程,例如
array\u reduce()
函数

避免所有这些丑陋的for循环,并大大简化代码:

$convert=函数($carry,$item){
$table=数组(
“a”=>“-”,
“b”=>“-…”,
“c”=>“-.-.-”,
“d”=>“-…”,
“g”=>“--.”,
“o”=>“--”;
//获取给定字母的对应值
$morse=$table[$item];
//返回带有附加莫尔斯字符的字符串
返回$carry.$morse;
};
//将“dog”拆分为一个数组,然后应用reduce将其转换为morse
数组减少(str_split('dog'),$convert);
// ➜  ~ php morse.php
// -..-----.

我知道问题和答案发布已经有一段时间了。我想我会添加我为将来发现这个问题的人编写的功能

代码
/**
*将字符串转换为莫尔斯
*
*@param string$string
*@返回字符串
*/
函数str_to_morse(string$string){
//将字符串设置为小写,并创建一个字符数组
$stringParts=str_split(strtolower($string));
//定义字典
$morseDictionary=[
“a'=>”.-“,
'b'=>'-…',
“c'=>”-.-.-。”,
'd'=>'-…',
“e'=>”,
“f'=>'…-”,
“g'=>'-”,
“h”=>“…”,
“我”=>“…”,
“j'=>”。--“,
“k'=>'-.-”,
'l'=>'。-…',
“m'=>'--',
“n'=>'-”,
“o'=>”--“o”,
“p'=>”。--,
“q'=>”--.-',
“r'=>”.-。”,
's'=>'…',
“t'=>'-”,
“u'=>'…-”,
“v'=>'…-”,
“w'=>”。--“,
'x'=>'-..-',
“y'=>”-.--',
'z'=>'--..',
'0' => '-----',
'1' => '.----',
'2' => '..---',
'3' => '...--',
'4' => '....-',
'5' => '.....',
'6' => '-....',
'7' => '--...',
'8' => '---..',
'9' => '----.',
'.' => '.-.-.-',
',' => '--..--',
'?' => '..--..',
'/' => '-..-.',
' ' => ' ',
];
$morse='';
foreach($stringParts作为$stringPart){
如果(数组\键\存在($stringPart,$morseDictionary)){
$morse.=$morseDictionary[$stringPart]。
; } } 返回$morse; }
您能够创建上面的脚本。我不认为您有任何理由不能完成此操作。这只是一些字符串操作。虽然我不想帮助您,但您需要完成您的家庭作业。:DThank you!这让我抓狂,但现在我可以看出我缺少了什么。您应该检查$string\u lower[$I]存在first@Farkie是的,你可以这么说,但由于OP几乎涵盖了所有字母/数字,因此它几乎不可能没有设置/存在,但唉,你是对的,我将修改我的答案。(我假设你的意思是检查
$string\u lower[$I]
是否存在于
$assoc\u数组中
)谢谢,这更有意义!我想我之所以使用foreach循环,是因为我认为我不能使用关联数组的索引(我认为我只能引用它的键)因此,我使用foreach循环逐个遍历每个值,并使其过于复杂化。我不确定我从何处得到了这个想法,但我很高兴我现在得到了澄清。再次感谢!我将添加代码来检查$string_lower[$I]首先存在,但此时我只是尝试让基础工作并从那里开始。大多数字母/数字都包含在数组中。
/*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';       
} 
/**
 * Convert string to morse
 *
 * @param string $string
 * @return string
 */
function str_to_morse(string $string) {
    // Make the string lowercase and create an array of the characters
    $stringParts = str_split(strtolower($string));

    // Define the dictionary
    $morseDictionary = [
        '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' => '----.',
        '.' => '.-.-.-',
        ',' => '--..--',
        '?' => '..--..',
        '/' => '-..-.',
        ' ' => ' ',
    ];

    $morse = '';
    foreach ($stringParts as $stringPart) {
        if (array_key_exists($stringPart, $morseDictionary)) {
            $morse .= $morseDictionary[$stringPart] . '<br />';
        }
    }

    return $morse;
}