Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] jakiego użyć algorytmu
Forum PHP.pl > Forum > Przedszkole
michbudz
witam. Chciałbym zaczerpnąć rad oraz opini, mianowicie robie taki skrypt który na podstawie słownika.txt układa wyrazy z podanych liter.
(fragment slownika)
Kod
abadański
abaddon
abaka
abakanka
abakanowicz
abakanabakan
abakańczyk
abakański
abak
abakus
abalietas
abandon
abat
abatysa
abazja
abażurek
abażur
abażuru
abba
abba
abba
abbandonasi
abbandonatamente
abbasyda
abbeville
abbozzo
abc
abchaski
abchazi


np.
podane litery to: 'abcdef' zadaniem skryptu jest ulozenie wyrazu ze slownika rozw. 'abc' (nie tylko)

udalo mi sie dojść do czegoś takiego że skrypt pobieda pojedynczo wiersze z pliku slownik.txt
wymyslilem potem cos takiego zeby slowo ze slownika wpisac do tablicy str_split();
z kolei pojedynczo sprawdzać czy pierwsza litera wyrazu znajduje sie w podanych literach ( to te np. abcdef)
przy uzyciu strstr(); jesli sie okaze ze wszystkie litery ze slowa ( tego ze slownika) znajdują się w podanych literach to oznacza że da sie z tego ulozyć taki wyraz. ta czynnos jest powtarzana az do końca slownika.



ALE nie przewidzialem jednego że wyraz ze słownika moze zawierać kilka tych samych liter co w efekcie daje cos takiego.... z dostepych liter 'abcdef' skrypt ulozy np. abba ale wiadomo ze niema 2x A i 2x B w dostepnych literach.

wszystkie wyrazy ulozone przez skrypt sa w tablicy zapisane ale co z tego jak czesc jest nie poprawna ( nie do ulozenia z podanych liter)

pokaze Co mi sie udalo zrobic.
(prosty formularz do podania liter)

index.html
  1. <form action="1.php" method=post>
  2. <input type="text" name="literki" size="10" maxlength="10">
  3. <input type="submit" value="szukaj">
  4. </form>
  5.  
  6.  
  7. </html>



teraz skrypt
1.php
  1. <?php
  2. echo include('index.html');
  3. $DOCUMENT_ROOT=$_SERVER['DOCUMENT_ROOT'];
  4. $open=fopen("$DOCUMENT_ROOT/../html/PL_NOWY.txt", 'r+'); //slownik
  5. $stog=$_POST['literki']; //pobranie liter
  6.  $ile_ulozonych=0;
  7.  while(! feof($open)) //petla odczytuje wyrazy ze slownika az do konca slownika i porownuje slowo z dostepnymi literami
  8.  {
  9.  $i=0;
  10. $igla=fgets($open, 999);
  11. $litery_slowa= str_split($igla);
  12. $ile_liter=strlen($igla)-1; // tutaj jest -1 bo jest o 1 znak za duzo przy kazdym slowie na koncu chyba spacja jest dodana 
    i usuwam ja
  13. while(strstr($stog, $litery_slowa[$i]))
  14. {
  15.  $i++;
  16. }
  17. if($i==$ile_liter && $i>1) //petla zapisuje do tablicy ulozony wyrazy
  18. {
  19.  $ulozony_wyraz[$ile_ulozonych]=$igla;
  20.  $ile_ulozonych++;
  21. }
  22. }
  23.  $ile_ulozonych--; //tutaj odejme jeden wyraz bo sie dodal wczesniej za duzo o 1
  24. $i=$ile_ulozonych;
  25. echo '<table border="1" bgcolor=#CCDDEE>';
  26. echo "<tr> <td>" . "ID"."</td><td>". "wyraz ". "</td></tr>";
  27.  $ulozony_wyraz=array_merge(array_flip(array_flip($ulozony_wyraz))); // a tutaj robie taki trik niektóre wyrazy sie powtarzaja w slowniku wiec beda sie
     powtarzaly ulozony wyrazy tutaj usuwaja sie powtarzajace
  28. $ile_ulozonych=count($ulozony_wyraz);
  29.  for($k=0; $k<$ile_ulozonych; $k++)
  30.  {
  31. echo "<tr><td>" . $k . "</td><td>". $ulozony_wyraz[$k] . "</td></tr>"; // no i wypisuje ale oczywiscie jest za duzo tych wyrazow bo ulozylo sie za duzo ,
     nie uwzglednilem wyzej opisanego bledu
  32.  
  33. }
  34.  
  35.  echo "</table>"; 
  36. ?>



macie jakies pomysly jak zrobic zeby bylo dobrze??

moze sa jakies lepsze algorytmy do takich rzeczy?? a moze jakies funkcje przydatne?
podajcie swoje pomysly.
Pozdrawiam i dziekuje z góry.
^bmb
Witam:] do zmiennej $literki bedziesz sobie z posta wyraz przekazywal , moga byc z pwtorzeniami liter lub bez. Zbyt dlugo nie testowalem wiec moga byc jakies przeoczenia ale wydaje sie ze dziala ok.

  1. <?php
  2. $literki='aabbsayd';
  3. $ilosc_lit=strlen($literki);
  4.  
  5. $tab_lit=array();
  6.  
  7. $correct_words=array();
  8.  
  9. for($i=0;$i<strlen($literki);$i++)
  10. {
  11. if(array_key_exists($literki[$i],$tab_lit))$tab_lit[$literki[$i]]++;
  12. else $tab_lit[$literki[$i]]=1;
  13. }
  14.  
  15.  
  16.  $open=fopen('dict.txt','r');
  17.  
  18.  while(! feof($open))
  19.  {
  20. $slowo=fgets($open);
  21. $temp_array=$tab_lit;
  22.  
  23. if(strlen(trim($slowo))!=$ilosc_lit)continue;//jesli nie maja tyle sam liter bierzemy kolejny wyraz
  24.  
  25. if(search(trim($slowo)))$correct_words[]=$slowo;
  26. }
  27.  
  28. function search($sl)
  29. {
  30. global $temp_array;
  31.  
  32. for($j=0;$j<strlen($sl);$j++)
  33. {
  34. if(array_key_exists($sl[$j],$temp_array) && $temp_array[$sl[$j]] != 0)$temp_array[$sl[$j]]--;
  35. else return false; // nie ma litery tego slowa w naszych wybranych
  36. }
  37.  
  38. if(array_sum($temp_array)==0)return true; //jesli po wszystkich obliczeniach zostalo 0 liter jest OK
  39. else return false;
  40.  
  41. }
  42.  
  43. echo '<h3>PRAWIDLOWE WYRAZY TO</h3>';
  44. echo '<pre>';
  45. print_r($correct_words);
  46. echo '</pre>';
  47. ?>
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.