我正在用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/>";
}
}
}
?>
答案 0 :(得分:4)
主要问题是你所做的“更多”。当您可以使用字符串从中获取所需数据时,无需像这样循环遍历$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提醒我)
答案 1 :(得分: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;
}
}
答案 2 :(得分:1)
您还可以使用一些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
// -..-----.
答案 3 :(得分:0)
我知道距问题发布和给出答案的答案已经有一段时间了。我以为我会增加我写的这个功能,供以后发现这个问题的人使用。
/**
* 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;
}