Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Różne warianty mieszania tekstu - jak to rozwiązać logicznie
Forum PHP.pl > Forum > Przedszkole
Octobus
Witam. Mam problem z rozwiązaniem logicznym pewnego problemu. Mam taki tekst i chodzi o to że tekst pomiędzy {} jest w wariantach w ktorych moga istniec inne warianty. Tak wiec z tekstu {a|b|c} wybrane bedzie albo a albo b albo c. Jezeli bedzie {a|b|wariant {c1|c2|c3} ostatni} wybrane bedzie albo a albo b albo "wariant c1 ostatni" lub "wariant c2 ostatni" lub "wariant c3 ostatni".
Najpierw wybierana jest wartosc z 1 poziomu wariantu czyli a lub b lub "wariant {c1|c2|c3} ostatni" jesli wybrane zostanie 3 wariant gdzie jak widac sa kolejne 3 warianty z których bedzie albo c1 albo c2 albo c3.

Pytanie teraz jak logicznie wymyslec zeby skrypt ulozyl wszystkie mozliwe kombinacje tekstu ? Przykladowy tekst:
Cytat
{Wygeneruj|Wybierz|Wypisz} mi liczbe {ulubiona wszystkich uzytkownikow|parzysta z podanych|nieparzysta z wylistowanych|{najbliższą z|najwyższą z|najdalszą od} czternastu podanych}


Pierwszy nawias daje nam 3 warianty ale drugi juz 4 w ktorych w ostatnim wariancie jest jeszcze inny zagniezdzony pakiet wariantow.
celbarowicz
Czy faktycznie potrzebne są wszystkie kombinacje? Jeśli skrypt ma wylosować jedną z możliwych to sytuacja nie jest tak złożona jak się wydaje.
Ponadto nie jestem pewien czy dokładnie opisujesz to co Tobie jest potrzebne.
Micchaleq
Moim zdaniem możesz utworzyć tablice z wariantami jakie chcesz ewentualnie jakoś je prze konwertować do tablicy np:

$zmienna1 = array( Wygeneruj,Wybierz,Wypisz);
$zmienna2 = array(ulubiona wszystkich uzytkownikow,parzysta z podanych,nieparzysta z wylistowanych);
$inna = array(najbliższą z,najwyższą z,najdalszą od);

i odpowiednio pobawić się trzema pętlami for.

  1. $zmienna1 = array( 'Wygeneruj','Wybierz','Wypisz');
  2. $zmienna2 = array('ulubiona wszystkich uzytkownikow','parzysta z podanych,nieparzysta z wylistowanych');
  3. $inna = array('najbliższą z','najwyższą z','najdalszą od');
  4.  
  5. for($i=0;$i<count($zmienna1);$i++){
  6. for($j=0;$j<count($zmienna2);$j++){
  7. for($k=0;$k<count($inna);$k++){
  8. echo $zmienna1[$i]." ".$zmienna2[$j]." ".$inna[$k]."<br>";
  9. }
  10. }
  11. }


coś takiego, wszystko zależy tutaj tak na prawdę od umieszczenia wypisywania danego tekstu.

PS: można zrobić to również w jednej tablicy, lecz musi mieć 3 pola $tablica[][][]
thek
Przecież to problem idealny do zastosowania rekurencji... :/ Nie wiem nad czym tu się jeszcze zastanawiać...
Sephirus
Mówisz masz wink.gif


Funkcja generująca losowy ciąg:
  1. function getRandomStringFrom($str)
  2. {
  3. if(preg_match_all('/\{([^\{\}]+)\}/si',$str,$matches))
  4. {
  5. foreach($matches[1] AS $m)
  6. {
  7. $mm = explode('|',$m);
  8. $str = str_replace('{'.$m.'}', $mm[mt_rand(0,count($mm)-1)],$str);
  9. }
  10.  
  11. if(strpos($str,'{')) $str = getRandomStringFrom($str);
  12. }
  13.  
  14. return $str;
  15. }
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.