Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Przeszukiwanie tablicy dwuwymiarowej, zwracanie klucza
Forum PHP.pl > Forum > Przedszkole
ficiek
Niestety napotkałem problem z którym nie mogę sobie poradzić.

Tablica zbudowana jest w poniższy sposób. Przechowuje ona elementy znalezione w bazie MySQL, pasujące do podanych przez użytkownika słów. Każde podane słowo jest wyszukiwane osobno, podany tekst nie jest traktowany jako fraza.
  1. (
  2. [0] => Array
  3. (
  4. [id] => 1
  5. [header] => Artykuł
  6. [date] => 1317559793
  7. [relevance] => 1
  8. )
  9. )

Chcę jednak uniknąć powtórzeń. Można by łatwo uniknąć tego wykonując na tablicy array_unique(), ale jak zapewne ktoś się domyślił relevance przechowuje liczbę pasujących wyszukiwanych słów. Przy ich pomocy będzie można odpowiednio wyświetlić wyniki.

Przechodzimy do sedna: muszę wyszukać w takiej dwuwymiarowej tablicy czy wpisano już taki artykuł. Jeśli tak revelance+=1. Jeśli nie dodajemy do tablicy.
  1. if (w tablicy $found znajduje się wiersz w którym id=$foo)
  2. {
  3. $found[ten wiersz]['relevance']+=1;
  4. }
  5. else
  6. {
  7. dodajemy do tablicy;
  8. }


Nie udało mi się wykorzystać array_search, prawdę mówiąc nie jestem nawet pewien czy ta funkcja działa dla dwuwymiarowej tablicy. Jestem otwarty na inne rozwiązania całego procesu wyszukiwania.
CuteOne
  1.  
  2. function qq($slowo, $array) {
  3.  
  4. $query = mysql_query(w zapytanie wrzucasz szukane słowo);
  5.  
  6. while($row = mysql_fetch_assoc($query)) {
  7.  
  8. if(array_key_exists($row['id'], $array)) {
  9.  
  10. $array['rele'][$row['id']]++;
  11. }
  12. else {
  13.  
  14. $array[$row['id']] = $row;
  15. }
  16. }
  17.  
  18. return $array;
  19. }
  20.  
  21. $array = array();
  22. foreach($szukane_frazy as $v) {
  23.  
  24. $array = qq($v, $array);
  25. }
  26.  
  27. print_r($array);



ps. a nie lepiej zrobić to po stronie mysql?? może pokaż zapytanie
Dominis
Jeśli dobrze zrozumiałem twoje pytanie to lepiej będzie zrobić tak jak kolega wyżej wspomniał, za pomocą mysql.

Zapytanie:

  1. SELECT id_artykul, header, COUNT(*) FROM tabela GROUP BY id_artykul ORDER BY DATA DESC


To zapytanie zwróci Ci id artykulu, header i liczbe ile tych artykulow pokazalo sie.
ficiek
Udało się, ale teraz stoję przed problemem posortowania tabeli malejąco wg relevance. Muszę ponownie prosić o pomoc, bo chyba źle rozumiem działanie funkcji array_multisort() - jakbym jej nie formułował nie zmienia się absolutnie nic.
Dominis
Kurcze, przynajmniej napisałbyś jak to zrobiles? za pomoca zapytania? Czy męczyłeś sie tablicami?

Jeśli za pomoca zapytania to mozesz zrobic:
  1. SELECT id_artykul, header, COUNT(*) AS rev FROM tabela GROUP BY id_artykul ORDER BY rev DESC


i odrazu masz posortowane, cud, miód i orzeszki.

Jeśli wybrałeś drogę trudniejsza, czyli bawisz sie tablicami to szukaj w google:

http://webhosting.pl/W.jaki.sposob.posorto...a.tablice.w.PHP
http://forum.php.pl/lofiversion/index.php/t20799.html

a najlepiej w manualu:

http://php.net/manual/en/function.array-multisort.php
ficiek
Zanim zadałem pytanie przeczytałem w necie na ten temat (w tym to co podałeś) i nic. Dziwi mnie to bo prawdopodobnie jest to banalne.

Co do rozwiązania to wykonuję jedno zapytanie które szuka wszystkich słów, a potem w PHP obliczam trafność dla danego artykułu. Po prostu pomimo przeczytania manuala i masy stron internetowych nie mogę posortować tablicy z wynikami po relevancy. Wygląda ona tak jak podałem w pierwszym poście.
Dominis
  1. <?php
  2. //tablica id|arty|data|rev
  3. $tabArr[0] = Array(2, 'art', '', 6);
  4. $tabArr[1] = Array(1, 'art', '', 10);
  5. $tabArr[2] = Array(2, 'art', '', 6);
  6. $tabArr[3] = Array(1, 'art', '', 44);
  7. $tabArr[4] = Array(2, 'art', '', 2);
  8. $tabArr[5] = Array(1, 'art', '', 0);
  9. $tabArr[6] = Array(2, 'art', '', 6);
  10. $tabArr[7] = Array(1, 'art', '', 4);
  11.  
  12. //wyswietlenie tablicy
  13. foreach($tabArr as $row){
  14. echo '<br />';
  15. foreach($row as $wynik)
  16. echo '|'.$wynik;
  17. }
  18.  
  19. //zrobienie pomocniczej tablicy do sortowania
  20. $i=0;
  21. foreach($tabArr as $row){
  22. $i++;
  23. //nasz rev
  24. $pomArr[$i] = $row[3];
  25. }
  26.  
  27. //sortowanie
  28. array_multisort($pomArr, SORT_ASC, $tabArr);
  29. echo '<br />********************<br />';
  30.  
  31. //wyswietlenie posortowanej tablicy
  32. foreach($tabArr as $row2){
  33. echo '<br />';
  34. foreach($row2 as $wynik2)
  35. echo '|'.$wynik2;
  36. }
  37. ?>


wynik:

  1. |2|art||6
  2. |1|art||10
  3. |2|art||6
  4. |1|art||44
  5. |2|art||2
  6. |1|art||0
  7. |2|art||6
  8. |1|art||4
  9. ********************
  10.  
  11. |1|art||0
  12. |2|art||2
  13. |1|art||4
  14. |2|art||6
  15. |2|art||6
  16. |2|art||6
  17. |1|art||10
  18. |1|art||44
ficiek
Dzięki, wygląda na to że popełniałem błąd w tablicy pomocniczej, więc funkcja dostawała po prostu błędne parametry. Dziękuję wszystkim za odpowiedzi.
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.