Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Przydzielanie tekstów do podstron serwisu na podstawie id rekordu
Forum PHP.pl > Forum > Przedszkole
-Greg-
Załóżmy, że mam 2.000.000 rekordów w bazie (podstrony serwisu) i wszędzie chcę wstawić dodatkowe teksty.
Mam 10 różnych tekstów, na każdej stronie ma być 5 tekstów (czasem może być mniej).
Chodzi o to, żeby teksty na każdej stronie były poukładane w innej kolejności (wiadomo, że czasem będą powtórzenia, ale to inna kwestia i powinna pomóc synonimizacja)
Po prostu ma być jak najbardziej unikalnie a teksty raz przypisane do id nie mogą się już zmieniać.

Jak to zrobić ?

Mój pomysł jest taki, że skoro mam id w przedziale (1...20000000) to mogę tekstom nadać numery i dla załóżmy id
o numerze 12345 pojawi się kolejno pierwsze pięć tekstów i analogicznie z innymi rekordami.

Problem pojawia się gdy id nie jest 5 cyfrowe, ale jeśli jest mniejsze to powiedzmy że tekstów będzie mniej, jeśli większe to odcinam nadmiar cyfr, żeby zawsze było 5 i po
sprawie, gorzej jak id ma postać typu 11211, wtedy by wychodziło, że 4 razy wyświetlam tekst numer 1 co jest bez sensu.

Jak to obejść najprościej i osiągnąć pożądany efekt ?
Może ktoś już robił coś w tym stylu i zna lepsze ?

Samokodziarz
Musisz po prostu przy pierwszym wyświetleniu strony losować pięć rekordów (ORDER by RAND) i zapisać sobie ich id w dodatkowych kolumnach lub (lepiej) w osobnej dwukolumnowej tabeli zawierającej numer strony i id artykułu do wyświetlenia pod spodem (po 5 rekordów na stronę).
-Greg-
W takim razie w jaki sposób wylosować z jakiegoś przedziału 5 liczb, przy założeniu, że żadna nie może się powtórzyć ?
Dlaczego osobna tabela jest lepszym rozwiązaniem, niż gromadzenie danych w jednej ?
thek
Skoro masz X tekstów, to zrób najprostsza możliwą rzecz...
1. Utwórz tabelę, ktora ma jako pola: id_podstrony(int) i id_tekstow(varchar)
2. Przy wchodzeniu na podstronę sprawdzaj czy ma ona już w tabeli swój rekord (można od razu JOINować przy pobieraniu by było szybciej). Jeśli są to odtwórz układ tekstów z podanych id poprzez explode i poskładaj teraz te teksty, synonimizuj je i co tam chcesz zrób.
3. Jeśli nie ma, to utwórz tablicę o elementach o numerach od $a do $b, $zbior = range($a, $b); i użyj na takim zbiorze $wylosowane = array_rand($zbiór, $ile_elementow_wylosowanych); Jeśli chcesz to możesz jeszcze dla zabawy to co Ci wylosowało trzasnąć shuffle. Na koniec robisz implode i zapis do bazy.

osobna tabela jest czesto lepsza z racji separacji danych od siebie. Jedna duża tabela jest często wolniejsza w działaniu niż kilka mniejszych. Ale by to wyjaśnić to już trzeba by tłumaczyć działanie silnika, sposób organizacji danych i dostępu do nich. Nie sądzę by akurat taka wiedza na tym etapie nauki była Ci szczególnie potrzebna.
Greg23
Dzięki za pomoc Thek! Wszystko pięknie działa.
Mam już wylosowane teksty, jednak nurtuje mnie teraz inny problem.

Chciałbym do każdego z nich powiedzmy w 4 miejscach wstawić 5 synonimów i przetasować
każdy tekst na wszystkie możliwe sposoby, żeby dostać jak najwięcej unikalnych kombinacji.

Nie pamiętam teraz wzoru na możliwą ilość kombinacji przy takim założeniu (5^4 czy jakośtak), ale na pewno będzie ich
sporo, powiedzmy 1000 kombinacji dla każdego tekstu, czyli dla 10 będę miał już 10.000 różnych tekstów.
Powiedzmy, że wszystkie kombinacje zapiszę do bazy pod kolejnymi id i będe znowu losował 5 tekstów z tych
już 10.000 a nie jak wcześniej 10 i wstawiał je na każdą podstronę.

Problem polega na tym, że losując 5 tekstów z tych 10.000 mogę wylosować 5 tych samych tekstów, tzn różniących się tylko synonimami
(czyli 5 tekstow z synonimizacji 1 tekstu podstawowego) a ja chcę wylosować 5 tekstów ale z każdego przedziału, czyli jak
mam pierwsze 1000 tekstów (synonimizacja pierwszego tekstu podstawowego) drugie 1000 tekstów (synonimizacja drugiego tekstu podstawowego) i
tak 10 razy, to chciałbym, żeby 5 tekstów, które wylosuje należały do osobnych przedziałów, czyli żeby nie było możliwości wylosowania
5 synonimizacji jednego tekstu tylko różnych.

Mam nadzieję, że w miarę jasno wytłumaczyłem o co mi chodzi smile.gif

W jaki sposób osiągnąć ten cel ?
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.