Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: tablica wielowymiarowa
Forum PHP.pl > Forum > PHP
attimo
wartosc nie chce sie przypisac do tablicy. przypisuje sie dla pierwszych dwoch wykonan ale potem juz nie chociaz warunek sie spelnia istnieje wartosc. chodzi o to ze kazde kolejne wpisanie litery powoduje jesli zgadza sie z wzorcem ucinanie o jeden i zpaisanie do tablicy.
  1. } else if(strlen($znak) > 1 && $_SESSION['usun'] == false) {
  2. for($i=0;$i<$_SESSION['ile'];$i++) {
  3. if($_SESSION['tab'][strlen($znak)-2][$i][0] === $znak[strlen($znak)-1]) {
  4. $_SESSION['tab'][strlen($znak)-1][] = substr($_SESSION['tab'][strlen($znak)-2][$i],1);
  5. if($_SESSION['tab'][strlen($znak)-1][$i][0] == '') {
  6. array_pop($_SESSION['tab']);
  7. }
  8. }
  9. }
  10. }
everth
Rozwiń co chcesz tutaj uzyskać. Mały tip:
Pyt:"Potrzebuję zaciemniacza do kodu PHP"
Odp: "Kod PHP jest wystarczająco zaciemniony"
attimo
Jest pole tekstowe po wciesnieciu klawisza lacze sie poprzez ajaxa do pliku php i nastepnie z baza mysql i pobieram wszystkie rekordy zapisujac je do tablicy. skrypt wyszukuje wyrazow kontunuujacych czyli np. wpisze kom to pokaze mi jako popowiedz to co wpisalem plus puter. tablica wyglada tak:

kazda kolejna litera powoduje utowrzenie nowego elementu z wyrazami ktore spelniaja warunek czyli sa kontunuacja. w dalszej czesci po usunieciu bede usuwal te elementy wiec nie powinno to za bardzo obciazac. problem jest taki, ze ten kod zadziala tylko jesli podam odpowiednik dla pierwsze elementu danego elmentu czyli w przykladzie bylaby to litera o i wygladalo by to tak jak powinno czyli:

niestety jesli wpisze juz litere inna niz wartosc pierwszego podelementu to sie nic nie wykonuje choc powinno. nie mam juz na to pomyslu.

troche wiecej kodu.
  1. $_SESSION['dlugosc'] = strlen($_POST['name']);
  2.  
  3. if(!isset($_SESSION['tab'])) {
  4. foreach($tablica as $wartosc) {
  5. if(strlen($znak) == 1 && strpos($wartosc,$znak) === 0) {
  6. $_SESSION['tab'][0][] = substr($wartosc,1); //pierwsze wywolanie powoduje zpaisanie wszystkich wyrazow kontunuujacych od danej litery
  7. $_SESSION['ile'] = count($_SESSION['tab'][0]);
  8. }
  9. }
  10. } else if(strlen($znak) > 1 && $_SESSION['usun'] == false) {
  11. for($i=0;$i<$_SESSION['ile'];$i++) {
  12. if($_SESSION['tab'][strlen($znak)-2][$i][0] === $znak[strlen($znak)-1]) {
  13. $_SESSION['tab'][strlen($znak)-1][] = substr($_SESSION['tab'][strlen($znak)-2][$i],1); // kazde kolejne powoduje zpaisanie do tablicy
  14. if($_SESSION['tab'][strlen($znak)-1][$i][0] == '') {
  15. array_pop($_SESSION['tab']);
  16. }
  17. }
  18. }
  19. }


edit..zmienna znak to wyraz wpisany do pola tekstowego
everth
Są dwa rozwiązania -
Pierwsze: wygenerowanie słownika w postaci drzewa (słowo klucz: uniwersalna struktura słownikowa) po stronie serwera i przesłanie go JSONem do przeglądarki oraz implementacja przeszukiwania tego drzewa w kodzie JS. To skomplikowane dla początkującego i nawet nie wiem czy mi by się udało. Po drugie ograniczeniem jest wielkość słownika - jest ok jak zmieści w kilkudziesięciu kilobajtach (przy kompresji nie powinno być tak źle, poza tym słownik może być w cache). Zaletą tego jest eliminacja zapytań do serwera (wszystko dzieje się po stronie klienta)

Drugie prostsze : słownik w bazie danych (jak u ciebie) + zastosowanie operatora LIKE. Implementacja wyglądałaby tak:
  1. użytkownik wpisuje jakiś znak
  2. algorytm sprawdza czy liczba znaków >= np. 3
  3. jeśli tak to wysyła ajaxem zapytanie do serwera
  4. serwer buduje zapytanie "select slowo from slownik where slowo LIKE 'znaki_usera%'
  5. wysyła odpowiedź którą JS pokazuje jako sugestie

Zalety są takie że odpada implementacja algorytmów przeszukiwania. Wadą jest konieczność odpytywania serwera - można temu zaradzić np. wprowadzając opóźnienie po evencie keyup (dzięki temu wiemy kiedy użytkownik skończy wpisywać frazę)

Mam nadzieję że ogarniasz to co napisałem tongue.gif.
attimo
Ja to zrobilem prosciej pobralem jeden raz wszystkie nazwy i potem operuje juz tylko na tablicy nie wykonuje ponownych zapytan wiec nie obciaza to bazy.

tylok jak tkos wpisuje od nowa to i tak sie wykonuje zapytanie ale mysle ze da sie to jakos obejsc sesja. nie nieszczyc jej na koncu tylko wyzerowac wartosci i nie bedzie konieczne ponowen zapytanie wiec w zasadzie zapyttanie wykona sie tylko przy pierwszym uruchomieniu wyszukiwarki.

co do opoznienia to na pewno wprowadze to, ale to jak bedzie mi dzialac to co mam smile.gif
everth
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:
[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()
  58. window.console.debug(typeof(k))
  59. if (!temp_dict[k]) {
  60. temp_dict[k] = (typeof(word[i+1])=='undefined') ? null:new Array();
  61. }
  62. temp_dict = temp_dict[k];
  63. }
  64. return this;
  65. };
  66.  
  67. /**
  68.  * Wyszukuje słowa pasujące do wzorca
  69.  *
  70.  * @this {Slownik}
  71.  * @param {word} Szukany wzorzec
  72.  * @return {result} Zwraca tablicę słów pasujących do wzorca
  73.  */
  74.  
  75. this.searchWord = function(word) {
  76. ref = getIndex(word);
  77. result= new Array();
  78. getMatches(result,ref,word);
  79. return result;
  80. };
  81.  
  82. function getIndex(word) {
  83. temp_ref = dict;
  84. w_length = word.length;
  85. for (k=0;k<w_length;k++) {
  86. i = word[k]//.charCodeAt(0).toString()
  87. if (temp_ref[i]) {
  88. temp_ref = temp_ref[i];
  89. } else {
  90. return false
  91. }
  92. }
  93. return temp_ref;
  94. };
  95.  
  96. function getMatches(result,ref,prev_word) {
  97. for(key in ref) {
  98. new_word = prev_word+key//String.fromCharCode(key);
  99. if (ref[key]==null) temp_ref = result.push(new_word);
  100. getMatches(result,ref[key],new_word)
  101. }
  102. };
  103. }
  104.  
  105. // Przykładowe połączenie z AJAX
  106.  
  107. $(document).ready(function() {
  108. $.get('slownik.php',function(result) {
  109. dictio = new Slownik(result); //tworzę słownik - słowa pobieram za pomocą JSON
  110. res = dictio.searchWord('h'); //zwraca dopasowania do litery h
  111. window.console.debug(res); //wyświetlam w konsoli
  112. },'json')
  113. });
[JAVASCRIPT] pobierz, plaintext

Oraz część w PHP
  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 dane w formacie JSON
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.