Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Przeszukiwanie tablicy
Forum PHP.pl > Forum > PHP
MadMark
Witam,

mam tablicę w której mam jakąś pulę zdań, po kolei:
0 => "zdanie numer jeden",
1 => "zdanie numer dwa"
itd

kiedy chce sobie znaleźć jedno słowo jest okej ale...

Jak w tablicy znaleźć tylko ten rezultat który zawiera jak najwięcej słów kluczowych (z innej tablicy) ?


Z góry dziękuję za wszelką pomoc smile.gif
piotr94
Czy to tablica w php, czy w bazie danych, np. MySQL?
Bo na bazach danych MySQL kiedyś takie rzeczy robiłem (ocena trafności) i mógłbym wtedy przybliżyć nieco temat.
MadMark
Wszystko w php.
tehaha
najprościej było by wykorzystać wyszukiwanie pełnotekstowe w mysql, ale w php też nie będzie ciężko to zrobić skoro nie masz problemu z wyszukiwaniem jednego słowa to i to nie sprawi Ci większego problemu. Przeszukuj po kolei po jednym słowie i zliczaj liczbę trafień dla klucza w tablicy i posortujesz po liczbie trafień, czyli żebyś otrzymał tablicę gdzie klucz to będzie klucz z tamtej tablicy, a wartość to liczba trafień
MadMark
No właśnie o to chodzi, że przeszukuje dla każdego słowa po kolei tę samą tablicę...
I właśnie chodzi mi o to, że dla dwóch słów przeszuka się jedna lista dwa razy, a ja bym chciał, aby było to zorganizowane w ten sposób, iż w jednym momencie przeszukuje kilkoma słowami (nie string! pojedyncze słowa).

Np.
wpisujemy sobie "szukam czegoś", explodujemy spację i szukamy 2 słów jednocześnie ... ale jak będzie np. 50 słów, to jak to zorganizować, żeby tylko raz przeszukać listę i do tego ustawić je wg "topowych" trafień?
mat-bi
array_count_values
piotr94
to robisz tak:
1. explode po spacjach dla stringa ze słowami do wyszukiwania (mamy tablicę_wyszukiwania)
2. potem foreach dla tablicy do przeszukania
a ) foreach dla tablicy ze słowami kluczowymi
i )sprawdzasz słowo i jeśli trafisz to inkrementujesz licznik związany z konkretnym elementem przeszukiwanej tablicy
3. sortujesz tablicę ze zliczeniem trafień z zachowaniem powiązania z tablicą w której szukasz i potem przez tą tablicę odwołujesz się do wyników
i tak czy siak (tzn czy będziesz przelatywał to w ten sposób, czyli dla każdego elementu słowa kluczowe, czy dla każdego słowa kluczowego wszystkie elementy, to okaże się, że... program wykona dokładnie tyle samo instrukcji ;-)
tehaha
@MadMark no to przecież w tej jednej pętli od razu sprawdzasz wszystkie słowa, nie musisz robić pętli dla każdego oddzielnej, zliczasz liczbę trafień i zapisujesz do drugiej tablicy gdzie klucz to klucz z tej przeszukiwanej a wartość to liczba trafień
@mat-bi - chyba nie przeczytałeś dokładnie co autor chce zrobić

tak na szybko to ja bym to zrobił tak:
  1. $search = array('Ala', 'ma', 'kota');
  2.  
  3. $base = array
  4. (
  5. 1=>'Ala ma ',
  6. 2=>'Ala ma kota',
  7. 3=>'Ala kota',
  8. 4=>'kota',
  9. 5=>'Stefan też ma kota',
  10. 6=>'Ale Mietek już nie'
  11. );
  12.  
  13. $result = array();
  14.  
  15. foreach($base as $key=>$record)
  16. {
  17. $result[$key] = 0;
  18. foreach($search as $search_word)
  19. {
  20. $result[$key] += substr_count($record, $search_word);
  21. }
  22. }
  23.  
  24. arsort($result);
  25. print_r($result);
MadMark
Dobra, ale czy ja tego dobrze używam?

  1. <?php
  2. function natrsort(&$array){
  3. natsort($array);
  4. $array = array_reverse($array);
  5. }
  6. function fix_c($text){
  7. $replaced = array('ą','ę','ś','ć','ń','ł','ź','ż','ó','Ą','Ę','Ś','Ć','Ń','Ł','Ź','Ż','Ó');
  8. $replacement = array('ą','ę','ś','ć','ń','ł','ź','ż','ó','Ą','Ę','Ś','Ć','Ń','Ł','Ź','Ż','Ó');
  9. $text = str_replace($replaced,$replacement,$text);
  10. return $text;
  11. }
  12. function no_c($text){
  13. $replaced = array('ą','ę','ś','ć','ń','ł','ź','ż','ó','Ą','Ę','Ś','Ć','Ń','Ł','Ź','Ż','Ó');
  14. $replacement = array('a','e','s','c','n','l','z','z','o','A','E','S','C','N','L','Z','Z','O');
  15. $text = str_replace($replaced,$replacement,$text);
  16. return $text;
  17. }
  18.  
  19. if(isset($_POST['dane']) && isset($_POST['str'])){
  20. include("./wordlist.php");
  21. $s = abs($_POST['str']);
  22. $builded = '';
  23. $max = ($s)*10;
  24. $min = $max-10;
  25. $r = 0;
  26. $x = $_POST['dane'];
  27. $newlist = array();
  28. $slowo = explode(" ",$x);
  29. array_unique($slowo);
  30. $result = array();
  31. foreach($list as $key=>$record){
  32. $result[$key] = 0;
  33. foreach($slowo as $search_word) {
  34. $result[$key] += substr_count($record, $search_word);
  35. }
  36. }
  37. asort($result);
  38. foreach($result as $k => $v){
  39. $newlist[$r] = $list[$k];
  40. $r++;
  41. }
  42. natrsort($newlist);
  43. $bu = array_unique($newlist);
  44. if(sizeof($bu) > 0){
  45. foreach($bu AS $b){
  46. if($p >= $min && $p < $max){
  47. $builded .= $b;
  48. $builded .= "{##}";
  49. }
  50. $p++;
  51. }
  52. }
  53. if($p > 0 && $builded != ''){
  54. echo fix_c($builded);
  55. }
  56. elseif($p > 0 && $builded == ''){
  57. echo fix_c("0{##}<br /><br />Za mało wyników wyszukiwania aby wyświetlić stronę ".$s." z podaną frazą - <b>".stripslashes($_POST['dane'])."</b>.<br />
  58. <br />Podpowiedzi:<br /><br />&bull; Przejdź do poprzedniej strony.<br /><br /><br /><br />");
  59. }
  60. else{
  61. echo fix_c("0{##}<br /><br />Podana fraza - <b>".stripslashes($_POST['dane'])."</b> - nie została odnaleziona.<br />
  62. <br />Podpowiedzi:<br /><br />&bull; Spróbuj użyć innych słów kluczowych.<br /><br /><br /><br />");
  63. }
  64. }
  65. ?>
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.