Wczoraj miałem zagwozdkę gdy opisywałem ci metodę na słownik. Dziś udało mi się chyba doprowadzić skrypt do postaci działającej. Nie jestem programistą więc prezentowane rozwiązanie może być naiwne, proszę o wyrozumiałość bardziej 'rozumnych'. Skrypt składa się z dwóch części - jedna po stronie PHP przygotowuje słownik z przykładowej listy słów, koduje i wysyła JSONem. Druga jako obiekt JS pozwala ten słownik rozkodować, modyfikować, przeszukiwać. Testowane tylko na Chrome, więc na innych może nie działać.
Skrypt JS:
// Obiekt Słownik
// .addWords(words) - dodaje słowa do słownika z tablicy;
// .addWord(word) - dodaje pojedyncze słowo
//
// .searchWord(pattern) - zwraca tablicę słów pasujących do dopasowania
/**
* Tworzy obiekt Słownik
*
* @constructor
* @this {Slownik}
* @param {slownik} przyjmuje sformatowany słownik (np. poprzez ajax)
*/
function Slownik(slownik) {
/** @private */ var dict = (typeof(slownik)!='undefined' && slownik) ? slownik:new Array();
/**
* Podmieniam plik słownika (np. na pobrany za pomocą ajaxa
*
* @this {Slownik}
* @param {new_dict} Nowy słownik
* @return {Slownik} Zwraca referencje do obiektu
*/
this.addDict = function(new_dict) {
dict = new_dict;
return this;
}
/**
* Dodaje słowa do słownika z tablicy
*
* @this {Slownik}
* @param {words} Jednowymiarowa tablica zawierająca słowa
* @return {Slownik} Zwraca referencje do obiektu
*/
this.addWords = function(words) {
ar_length = words.length
for(i in words) {
this.addWord(words[i]);
}
return this;
}
/**
* Dodaje słowo do słownika
*
* @this {Slownik}
* @param {word} Dodawane słowo
* @return {Slownik} Zwraca referencje do obiektu Slownik
*/
this.addWord = function(word) {
var temp_dict = dict;
w_length = word.length;
for (i=0;i<w_length;i++) {
k = word[i]//.charCodeAt(0).toString()
window.console.debug(typeof(k))
if (!temp_dict[k]) {
temp_dict[k] = (typeof(word[i+1])=='undefined') ? null:new Array();
}
temp_dict = temp_dict[k];
}
return this;
};
/**
* Wyszukuje słowa pasujące do wzorca
*
* @this {Slownik}
* @param {word} Szukany wzorzec
* @return {result} Zwraca tablicę słów pasujących do wzorca
*/
this.searchWord = function(word) {
ref = getIndex(word);
result= new Array();
getMatches(result,ref,word);
return result;
};
function getIndex(word) {
temp_ref = dict;
w_length = word.length;
for (k=0;k<w_length;k++) {
i = word[k]//.charCodeAt(0).toString()
if (temp_ref[i]) {
temp_ref = temp_ref[i];
} else {
return false
}
}
return temp_ref;
};
function getMatches(result,ref,prev_word) {
for(key in ref) {
new_word = prev_word+key//String.fromCharCode(key);
if (ref[key]==null) temp_ref = result.push(new_word);
getMatches(result,ref[key],new_word)
}
};
}
// Przykładowe połączenie z AJAX
$(document).ready(function() {
$.get('slownik.php',function(result) {
dictio = new Slownik(result); //tworzę słownik - słowa pobieram za pomocą JSON
res = dictio.searchWord('h'); //zwraca dopasowania do litery h
window.console.debug(res); //wyświetlam w konsoli
},'json')
});
Oraz część w PHP
class Dictionary {
function __construct($words) {
$this->createDictionary($words);
}
function createDictionary($words) {
foreach($words as $word) {
$this->addWord($word);
}
}
function addWord($word) {
$temp_dict =& $this->dict;
for($i=0;$i<$w_length;$i++) {
$char = $word[$i];
if (!isset($temp_dict[$char])) { $temp_dict[$char] = (isset($word[$i+1
])) ?
array():NULL; }
$temp_dict =& $temp_dict[$char];
}
return $this;
}
function getJSON() {
return json_encode($this->dict);
}
}
// ZASTOSOWANIE
$words = array('hihi','hyhy','humhum'); //przykładowe słowa
$dict = new Dictionary($words); //tworzę słownik
echo $dict->getJSON(); //pobieram dane w formacie JSON