【问题标题】:PHP Morse code converterPHP莫尔斯电码转换器
【发布时间】:2016-07-09 01:58:20
【问题描述】:

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

【问题讨论】:

  • 您可以创建上面的脚本。我看不出有什么理由让你不能做到这一点。这只是一些字符串操作。虽然我不想帮你,但你需要做功课。 :D

标签: php arrays loops converter morse-code


【解决方案1】:

主要问题是您做的“更多”超出了必要。当您可以使用字符串从中获取所需数据时,无需像这样循环遍历您的$assoc_array

这也使用了更少的资源,因为您只需循环所需的字母/数字/空格的确切数量,而不是从 a-z0-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-z0-9 中的所有内容,您可以轻松调用所需的字母,而不必担心丢失数据。

编辑: 添加了isset() 检查,因为$assoc_array 涵盖了所有需要的字母/数字,所以几乎不需要它,但安全总比抱歉好。 (感谢@Farkie 提醒我)

【讨论】:

  • 你应该先检查 $string_lower[$i] 是否存在
  • @Farkie 是的,你可以这么说,但由于 OP 几乎涵盖了每个字母/数字,因此几乎不可能没有设置/那里,但是唉,你是对的,我会的修改我对此的回答。 (我假设您的意思是检查 $string_lower[$i] 是否存在于 $assoc_array 中)
  • 谢谢,这更有意义!我认为我使用 foreach 循环的原因是因为我认为我不能将索引与关联数组一起使用(我认为我只能引用它的键)所以我使用 foreach 循环来遍历每个值一次又一次使事情复杂化。我不确定我从哪里得到这个想法,但我很高兴我现在已经澄清了。再次感谢!
  • 我将添加代码以首先检查 $string_lower[$i] 是否存在,但此时我只是想让基础知识工作并从那里开始。大多数字母/数字都包含在数组中。
【解决方案2】:

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

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

真正的问题是 0 被评估为假,这意味着当它循环它时,它将是一个真值(假 ==假)。

您可以通过相同的 (===) 匹配更好地解决它:

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

【讨论】:

  • 谢谢!它让我发疯,但现在我可以看到我错过了什么。
【解决方案3】:

你也可以使用一点php函数式编程,比如array_reduce()函数http://php.net/manual/en/function.array-reduce.php

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

$convert = function($carry, $item) {
    $table = array(
        "a" => ".-",
        "b" => "-...",
        "c" => "-.-.",
        "d" => "-..",
        "g" => "--.",
        "o" => "---");
    // Get the correspondent value for the given letter
    $morse = $table[$item];
    // Return the string with appended morse character
    return $carry . $morse;
};

// Split 'dog' into an array, then apply a reduce to convert it to morse
array_reduce(str_split('dog'), $convert);
// ➜  ~ php morse.php                                                     
// -..-----.

【讨论】:

    【解决方案4】:

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

    代码

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      相关资源
      最近更新 更多