Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [klasa JS]
Forum PHP.pl > Forum > Gotowe rozwiązania > Algorytmy, klasy, funkcje
everth
Witam, ostatnio pewien post podsunął mi pomysł opracowania wyszukiwania słownikowego. Przy okazji postanowiłem trochę podreperować swój czysty JS. Więc stworzyłem klasę typu słownik która za pomocą bazy słów zgromadzonych wcześniej w pamięci może podpowiadać słowa pasujące do wzorca. Klasa jest prymitywna, nie do końca jestem pewien czy dobrze zaimplementowana - w każdym razie ostatnio jak testowałem to osiągnęła status "nie wiem jak, ale działa". Osobną kwestią pozostaje pytanie o sens stosowania takiego rozwiązania i jego wydajność. Skrypt testowany tylko pod Chrome. Wrzucam i komentujcie (jeśli w ogóle jest co winksmiley.jpg).

ADD: Próbowałem wdrożyć się w komentowanie za pomocą JSDoca, ale nie wiem czy dobrze zrozumiałem składnię - dla ułatwienia dodałem na górze skryptu opis tych paru metod

[JAVASCRIPT] pobierz, plaintext
  1. // Obiekt Słownik
  2. // .addWords(words) - dodaje słowa do słownika z tablicy;
  3. // .addWord(word) - dodaje pojedyncze słowo
  4. //
  5. // .searchWord(pattern) - zwraca tablicę słów pasujących do dopasowania
  6.  
  7. /**
  8.  * Tworzy obiekt Słownik
  9.  *
  10.  * @constructor
  11.  * @this {Slownik}
  12.  * @param {slownik} przyjmuje sformatowany słownik (np. poprzez ajax)
  13.  */
  14. function Slownik(slownik) {
  15. /** @private */ var dict = (typeof(slownik)!='undefined' && slownik) ? slownik:new Array();
  16.  
  17.  
  18. /**
  19.  * Podmieniam plik słownika (np. na pobrany za pomocą ajaxa
  20.  *
  21.  * @this {Slownik}
  22.  * @param {new_dict} Nowy słownik
  23.  * @return {Slownik} Zwraca referencje do obiektu
  24.  */
  25. this.addDict = function(new_dict) {
  26. dict = new_dict;
  27. return this;
  28. }
  29.  
  30. /**
  31.  * Dodaje słowa do słownika z tablicy
  32.  *
  33.  * @this {Slownik}
  34.  * @param {words} Jednowymiarowa tablica zawierająca słowa
  35.  * @return {Slownik} Zwraca referencje do obiektu
  36.  */
  37.  
  38. this.addWords = function(words) {
  39. ar_length = words.length
  40. for(i in words) {
  41. this.addWord(words[i]);
  42. }
  43. return this;
  44. }
  45.  
  46. /**
  47.  * Dodaje słowo do słownika
  48.  *
  49.  * @this {Slownik}
  50.  * @param {word} Dodawane słowo
  51.  * @return {Slownik} Zwraca referencje do obiektu Slownik
  52.  */
  53. this.addWord = function(word) {
  54. var temp_dict = dict;
  55. w_length = word.length;
  56. for (i=0;i<w_length;i++) {
  57. k = word[i]//.charCodeAt(0).toString() - osobna kwestia to kodowanie znaków, nie udało mi się tego rozwiązać
  58. if (!temp_dict[k]) {
  59. temp_dict[k] = (typeof(word[i+1])=='undefined') ? null:new Array();
  60. }
  61. temp_dict = temp_dict[k];
  62. }
  63. return this;
  64. };
  65.  
  66. /**
  67.  * Wyszukuje słowa pasujące do wzorca
  68.  *
  69.  * @this {Slownik}
  70.  * @param {word} Szukany wzorzec
  71.  * @return {result} Zwraca tablicę słów pasujących do wzorca
  72.  */
  73.  
  74. this.searchWord = function(word) {
  75. ref = getIndex(word);
  76. result= new Array();
  77. getMatches(result,ref,word);
  78. return result;
  79. };
  80.  
  81. function getIndex(word) {
  82. temp_ref = dict;
  83. w_length = word.length;
  84. for (k=0;k<w_length;k++) {
  85. i = word[k]//.charCodeAt(0).toString()
  86. if (temp_ref[i]) {
  87. temp_ref = temp_ref[i];
  88. } else {
  89. return false
  90. }
  91. }
  92. return temp_ref;
  93. };
  94.  
  95. function getMatches(result,ref,prev_word) {
  96. for(key in ref) {
  97. new_word = prev_word+key//String.fromCharCode(key);
  98. if (ref[key]==null) temp_ref = result.push(new_word);
  99. getMatches(result,ref[key],new_word)
  100. }
  101. };
  102. }
  103.  
  104. // Przykładowe połączenie z AJAX (używam jQuery)
  105.  
  106. $(document).ready(function() {
  107. $.get('slownik.php',function(result) {
  108. dictio = new Slownik(result); //tworzę słownik - słowa pobieram za pomocą JSON
  109. res = dictio.searchWord('h'); //zwraca dopasowania do litery h
  110. window.console.debug(res); //wyświetlam w konsoli
  111. },'json')
  112. });
[JAVASCRIPT] pobierz, plaintext

Skrypt do PHP budujący słownik po stronie serwera
  1. class Dictionary {
  2.  
  3. private $dict = array();
  4.  
  5. function __construct($words) {
  6. $this->createDictionary($words);
  7. }
  8.  
  9. function createDictionary($words) {
  10. foreach($words as $word) {
  11.  
  12. $this->addWord($word);
  13. }
  14. }
  15.  
  16. function addWord($word) {
  17. $temp_dict =& $this->dict;
  18. $w_length = strlen($word);
  19. for($i=0;$i<$w_length;$i++) {
  20. $char = $word[$i];
  21. if (!isset($temp_dict[$char])) {
  22. $temp_dict[$char] = (isset($word[$i+1])) ? array():NULL;
  23. }
  24. $temp_dict =& $temp_dict[$char];
  25. }
  26. return $this;
  27. }
  28.  
  29. function getJSON() {
  30. return json_encode($this->dict);
  31. }
  32.  
  33. }
  34.  
  35. // ZASTOSOWANIE
  36.  
  37. $words = array('hihi','hyhy','humhum'); //przykładowe słowa
  38.  
  39. $dict = new Dictionary($words); //tworzę słownik
  40. echo $dict->getJSON(); //pobieram słownik zakodowany w formacie JSON
wookieb
Dlaczego w php wypluwasz CAŁY słownik zamiast po prostu wygenerować w php tylko te słowa, które są potrzebne?
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-2024 Invision Power Services, Inc.