PHP 摩尔斯电码转换器
PHP Morse code converter
我正在 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/>";
}
}
}
?>
最简单的修复方法是在回显后添加一个 'break':
foreach($assoc_array as $letter => $code){
if($letter == $string_lower[$i]){
echo "$code<br/>";
break;
}
}
真正的问题是 0 的计算结果为 false,这意味着当它循环遍历它时,它将是一个真值 (false == false)。
你可以通过做一个相同的 (===
) 匹配来更好地解决它:
foreach($assoc_array as $letter => $code){
if($letter === $string_lower[$i]){
echo "$code<br/>";
break;
}
}
主要问题是您所做的 "more" 超出了必要。当您可以使用字符串从中获取所需数据时,无需像那样循环遍历 $assoc_array
。
这也使用了更少的资源,因为不是从 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';
}
由于您的数组包含 a-z
和 0-9
中的所有内容,因此您可以轻松调用所需的字母而不必担心丢失数据。
编辑:
添加了 isset()
检查,几乎不需要它,因为 $assoc_array
涵盖了每个需要的字母/数字,但安全总比抱歉好。 (感谢@Farkie 提醒我)
您还可以使用一些 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
// -..-----.
我知道自发布问题和给出答案以来已经有一段时间了。我想我会添加我为将来发现这个问题的人写的这个功能。
代码
/**
* 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;
}
我正在 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/>";
}
}
}
?>
最简单的修复方法是在回显后添加一个 'break':
foreach($assoc_array as $letter => $code){
if($letter == $string_lower[$i]){
echo "$code<br/>";
break;
}
}
真正的问题是 0 的计算结果为 false,这意味着当它循环遍历它时,它将是一个真值 (false == false)。
你可以通过做一个相同的 (===
) 匹配来更好地解决它:
foreach($assoc_array as $letter => $code){
if($letter === $string_lower[$i]){
echo "$code<br/>";
break;
}
}
主要问题是您所做的 "more" 超出了必要。当您可以使用字符串从中获取所需数据时,无需像那样循环遍历 $assoc_array
。
这也使用了更少的资源,因为不是从 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';
}
由于您的数组包含 a-z
和 0-9
中的所有内容,因此您可以轻松调用所需的字母而不必担心丢失数据。
编辑:
添加了 isset()
检查,几乎不需要它,因为 $assoc_array
涵盖了每个需要的字母/数字,但安全总比抱歉好。 (感谢@Farkie 提醒我)
您还可以使用一些 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
// -..-----.
我知道自发布问题和给出答案以来已经有一段时间了。我想我会添加我为将来发现这个问题的人写的这个功能。
代码
/**
* 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;
}