Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Przydzielanie tekstów do podstron serwisu na podstawie id rekordu, Jak sprawić, żeby było unikalnie ?
--Greg--
post
Post #1





Goście







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 ?

Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
Samokodziarz
post
Post #2





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 29.03.2012

Ostrzeżenie: (0%)
-----


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ę).
Go to the top of the page
+Quote Post
--Greg--
post
Post #3





Goście







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 ?
Go to the top of the page
+Quote Post
thek
post
Post #4





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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.
Powód edycji: [thek]: Małe wyjaśnienie


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
Greg23
post
Post #5





Grupa: Zarejestrowani
Postów: 120
Pomógł: 0
Dołączył: 6.04.2012

Ostrzeżenie: (0%)
-----


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 ?


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 18:47