2016-03-22 17 views
3

PHP'de bir string alıp morse koduna dönüştürebilen bir temel mors kod dönüştürücü yazıyorum. İlişkilendirme dizisi, foreach döngüsü ve for döngüsü kullanmaktadır. Bazı nedenlerden ötürü, her dönüştürülmüş karakterden sonra '0' için eşdeğer morse kodunu çıkarır. 0'ın nereden geldiğini anlayamıyorum. İlişkisel diziden 0 çıkarırsam sorun olmaz ama sayıları da dönüştürebilmek istiyorum. Birisi bana geri bildirim verebilirse, bu çok takdir edilecektir. İşte PHP Mors kodu dönüştürücü

kodudur:

<?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/>"; 
      } 
     } 
    } 
?> 
+1

Yukarıdaki senaryoyu oluşturdunuz. Bunu yapamayacağın için hiçbir sebep göremiyorum. Bu sadece bir dizi manipülasyon. Sana yardım etmese de, ödevini yapmalısın. : D –

cevap

4

ana sorun, gerekli olandan "daha" yapıyor olmasıdır. $assoc_array kodunuzu kullanarak, gerekli verileri buradan almak için dizgeyi kullanabilirsiniz.

Bu, a-z ve 0-9 arasındaki döngüden ziyade daha az kaynak kullanır, yalnızca gereken harf/sayı/boşluk miktarını döndürürsünüz. dizinizde kolayca, sadece veriler eksik endişesi duymadan gerekli harfleri çağırabilir a-z ve 0-9 her şeyi içerdiğinden

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

.

Düzenleme: $assoc_array her ihtiyaç harf/sayı kapakları gibi Eklendi bir isset() çek, pek gerekli olacaktır, ama üzgünüm daha iyi güvenli. Böyle döngüler için tüm bu çirkin kaçınmak ve kod oldukça çok basitleştirerek array_reduce() fonksiyon http://php.net/manual/en/function.array-reduce.php

olarak da php fonksiyonel programlama biraz kullanabilirsiniz

+0

$ string_lower [$ i] seçeneğinin ilk – Farkie

+0

@Farkie var olduğunu kontrol etmelisiniz. Bunu tartışabilirdiniz, ancak OP'nin hemen hemen her harf/sayıya sahip olmasından dolayı, orada ayarlanma şansı neredeyse yoktur, ama Haklısın ve cevabımı değiştireceğim. (Demek istediğim, $ string_lower [$ i] 'in' $ assoc_array'da var olduğunu kontrol etmelisiniz) – Epodax

+0

Teşekkürler, bu daha mantıklı! Foreach döngüsünü kullanmamın sebebi bence bir ilişkilendirici dizi ile indekslemeyi kullanamayacağımı düşünmüyordum (sadece anahtarına atıfta bulunabileceğimi düşündüm) bu yüzden her bir değerden geçmek için bir foreach döngüsü kullanıyordum. Bir ve daha karmaşık hale getiriyor. Bu fikri nereden aldığımdan emin değilim ama şimdi temizlediğime sevindim. Tekrar teşekkürler! – 8se7en

2

en basit düzeltme yankı sonra 'mola' eklemek basittir:

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

asıl sorun 0 yanlış değerlendirmek olduğunu, Yani bunun üzerinde döngü yaparken, bir gerçek (yanlış = = yanlış) olacak.

Sen özdeş (===) maç yaparak daha da iyi çözebilir:

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

Teşekkürler! Beni deli ediyordu ama şimdi neyi kaçırdığımı görebiliyorum. – 8se7en

1

(hatırlattığın için @Farkie Kredi):