Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Działanie na tablicach
Forum PHP.pl > Forum > Przedszkole
sadistic_son
Witam,

Mam 2 tablice. Jedna zawiera litery, druga słowa. Niech tablica z literami zawiera litery: a,l,s,p,i,e.
Chciałbym wyszukać wszystkie słowa z 2 tablicy które są zbudowane tylko z tych liter zawartych w 1 tablicy. Czyli np. słowa pies, ala, las, lis itd.

Jakieś pomysły?


JoShiMa
Wyrażenia regularne?
minolone
Dobrym sposobem powinno byc wygenerowanie wszystkich kombinacji z danych liter i sprawdzenie w drugiej tablicy czy dane slowo istnieje,
Dosc pomocna do tego moze byc ta klasa:
http://stereofrog.com/blok/on/070910
chyba ze sie myle no to sorki, ale kiedys sam tego uzywalem do przeszukiwania w bazie prawie 3mln slowek slownika "sjp do gier" z podanych liter i calkiem niezle sie to spisywalo,

Delikatna modyfikacja i powinno smigac jak marzenie

Pozdrawiam
erix
array_filter + odpowiedni preg_match albo pętla sprawdzająca znak po znaku.
Pawel_W
Cytat(minolone @ 21.02.2011, 22:39:45 ) *
Dobrym sposobem powinno byc wygenerowanie wszystkich kombinacji z danych liter

to nie zadziała, przecież jako przykład podane jest ala, czyli mogą się dowolnie powtarzać smile.gif

poza tym nie wydaje mi się, żeby generowanie wszystkich kombinacji z np. 20 liter było dobrym rozwiązaniem
sadistic_son
Cytat(Pawel_W @ 21.02.2011, 23:55:57 ) *
to nie zadziała, przecież jako przykład podane jest ala, czyli mogą się dowolnie powtarzać smile.gif

Małe sprostowanie... jeśli mamy w tablicy z literami jakąs literę X razy to może się powtórzyć w słowie maksymalnie X razy.

Cytat(minolone @ 21.02.2011, 22:39:45 ) *
kiedys sam tego uzywalem do przeszukiwania w bazie prawie 3mln slowek slownika "sjp do gier"
z podanych liter i calkiem niezle sie to spisywalo,
Dokładnie o to mi chodzi. Wczytuję do tablicy plik txt który ma prawie 40MB, jest tam prawie 3mln słów. To ten sam słownik.

Generalnie chodzi mi o to aby program z podanych liter układał słowa. Taki algorytm do gry w scrabble.
Wiem, że można by użyć preg_match ale nie bardzo mam pomysł jak przeszukać tablicę tablicą.
Pozostaje jeszcze problem potężnej ilości przetwarzanych danych. W pętli forach może to zając wieki.
Na razie działam na skrawku tego pliku ze słownikiem bo gdy wczytałem go całego za pomocą file_get_contents a następnie chciałem wyświetlić to serwer mi się zawiesił po 10 minutach mielenia smile.gif

Cytat(erix @ 21.02.2011, 23:19:19 ) *
array_filter + odpowiedni preg_match albo pętla sprawdzająca znak po znaku.
A jak w takim przypadku miałoby wyglądać wyrażenie ?


Jak w ogóle sądzicie? Pod względem wydajnościowym jest sens robić to w php czy lepiej spróbować w innym środowisku?
minolone
Ja akurat używałem tej klasy do gry "szufelka" generowałem sobie słowa od 3 do 7 liter tak ze to nie robiło jakiegoś strasznego zamulenia, i wszystko było oparte o bazę danych,
skracając wyszukiwanie weź pod uwagę to ze czasami z jednego słowa można ułożyć tez inne, np: masło, słoma, i te literki są już takie same. takich słówek jest w tym słowniku bardzo dużo.
wiec zasada działanie była trochę u mnie inna nie przeszukiwałem słówek lecz miałem słowa ułożone w kolejności alfabetycznej w bazie czyli np: masło to miałem 'ałmos' ze słomy litery są takie same, miałem je zahashowane (sha1) i porobione dowiązania, jeden hash kilka słówek, wyszukując po hashu zaoszczędzałem sporo czasu. możesz pokombinować na różne sposoby, odciążając trochę serwer nie musisz od razu wyszukiwać slow składających się z 3, 4, 5, 6, 7, 8, 9 znaków tylko osobno, weź pod uwagę tez ze w grze w scrabble rzadko układasz bardzo długie słowa, wiec słowa np które maja powyżej 10 czy tam więcej znaków nie będą ci potrzebne wiec możesz je usunąć, a tym samym odchudzisz plik o prawie polowe. zaglądając w ten plik sjp widziałeś pewnie jakie tam są słowa.
Pozdrawiam
erix
Cytat
Wiem, że można by użyć preg_match ale nie bardzo mam pomysł jak przeszukać tablicę tablicą.

Nie musisz przeszukiwać; najważniejsze, to mieć wyrażenie, które sprawdzi jednego stringa, czy składa się z wymaganych znaków.

Wtedy możesz spokojnie to sprawdzić przez array_filter albo nawet w pętli, jeśli czytasz to strumieniowo.

Jeśli chodzi o wyrażenie, to przecież masz modyfikator ilości ("a{0,3}"), więc ułożenie wyrażenia jakieś szczególnie trudne nie będzie. wink.gif I podejrzewam, że przy tak krótkim wzorcu efektywniej będzie sprawdzić to pregiem, aniżeli w jakiś inny sposób przemielać.

Cytat
Jak w ogóle sądzicie? Pod względem wydajnościowym jest sens robić to w php czy lepiej spróbować w innym środowisku?

Nie zdziwiłbym się, gdyby awk przemielił to wszystko w kilka sekund, ale nie potrafię się jeszcze sensownie posługiwać tym narzędziem. wink.gif
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.