Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Funkcja losująca
Forum PHP.pl > Forum > Przedszkole
Xart
Witam piszę sobie dla nauki pewne skrypty ostatnio i jak czegoś nie wiem to pytam biggrin.gif
Mam do was prośbę abyście odesłali mnie do jakiś źródeł jak zrobić pewien system ("losowania/przydzielania")

Dokładniej

Mam w bazie danych tabele zawodnicy

// id // imie i nazwisko // klub //

i np:

1 // Wacał Markowski // Wojownik Elbląg
itd...


Załóżmy, że mam 16 zawodników i skrypt ma losowo dobrać ich w prawy, z tym że musza być z innego klubu i to jest pierwsza runda. Potem skrypt z pozostałych 8 losuje między sobą z tym że jeżeli istnieje taka możliwość muszą być z różnych klubów i tak dalej aż do półfinału...

Jakich funkcji użyć ?
Może jakieś podpowiedzi / części kodu ?
Może link do manuala

Będę wdzięczny za każdą pomoc smile.gif
nospor
Losujesz pierwszego, potem dla niego szukasz drugiego z innego klubu.
Potem losujesz znowu jednego i dla niego drugiego z innego klubu.
itd

Gdy w danym losowaniu nie bedzie kolesia z innnego klubu, to wowczas losujesz z jego klubu

Xart
@UP

Dzięki za podpowiedź takie rozwiązanie jest dobre bo czy będę miał 30 czy 10 to się sprawdzi

Oczywiście jeżeli liczba jest nie parzysta to przechodzi bez walki itd.

I to sobię zrobie na if'ach ale jakiej funkcji użyć do losowania ?
Byłbym wdzięczny bardzo za jakieś przykładowe kawałki kodu wink.gif
nospor
jesli robic bedziesz w bazie to
...order by rand()
Przy tak malej liczbie rekordow jest to wystarczajace rozwiązanie
Xart
@UP
Wolałbym zrobić to jednak na innej zasadzie.

Pobieram dane z bazy do tablicy.
Wybieram pierwszego zawodnika z listy i losuję do niego z innym klubem -> Jak to napisać ?
nospor
Co ty z tym UPem? Przeciez wiem ze z dolem nie gadasz...

W bazie mozesz zrobic warunki w zapytaniu. Robiąc to na tablicy w php bedziesz musial latac i sprawdzac wszystko pokolei
Xart
A mógłbyś podać jakiś konkretny przykład bo właśnie ja widzę tylko taką moetodę po kolei...
nospor
Nie bardzo rozumiem w czym problem. Napisalem ci krok po kroku co masz robic. Podalem ci jak sie losuje w mysql. Jaki masz konkretnie problem?
Xart
Podałeś mi tylko metodę sortowania wyników z bazy danych...

order by rand()

i to rozumiem ale do tego warunku nie da się dopisać że nie mogę być z 1 drużyny...
nospor
No juz takie podstawy jak
....WHERE ID_DRUZYNY<>ID_DRuZYNY_KOLESIA_DLA_KTOREGO_SZUKASZ
juz sobie darowalem. Sadzilem ze umiesz korzystac z WHERE w zapytaniach...
Xart
Ale takim sposobem dla każdego kolesia muszę szukać odzielnie... a ja nie będę miał stałej liczby tylko np będę musiał dopisać 10 zawodników to 10 będę musiał dorobić 10 zapytań ...
Nie ma jakiegoś innego sposobu >
nospor
Cytat
Ale takim sposobem dla każdego kolesia muszę szukać odzielnie
No tak. Dokladnie to wynikalo z psedokodu jaki ci podalem.
Xart
Mógłby ktoś napisać mi jakiś przykład w PHP ?


Próbowałem to zrobić ale coś mi nie wyszło...



  1. <table>
  2. <?php
  3. include('inc/config.php');
  4. $zapytanie = $mysqli->query("SELECT * FROM `zawodnicy` order by id");
  5. $wynik = $zapytanie->fetch_assoc();
  6. for ($i=1; $i>=8; $i=$i+2;){
  7. $zapytanie1 = $mysqli->query("SELECT * FROM `zawodnicy` WHERE `id` = '$i'");
  8. $wynik1 = $zapytanie1->fetch_assoc();
  9. $druzyna = $wynik1['druzyna'];
  10. $zapytanie2 = $mysqli->query("SELECT * FROM `zawodnicy` WHERE `id` = '$i++' AND `druzyna` != '$druzyna'");
  11. $wynik2 = $zapytanie2->fetch_assoc();
  12. echo $wynik1['nazwa'] $wynik2['nazwa'];
  13. echo '<br>';
  14. }
  15. ?>
  16. </table>


Niestety nie działa i chyba nie za bardzo ma prawo działać...
Turson
  1. $zapytanie = $mysqli->query("SELECT * FROM `zawodnicy` order by id");
  2. $wynik = $zapytanie->fetch_assoc();
  3. for ($i=1; $i>=8; $i=$i+2;){
  4. $zapytanie1 = $mysqli->query("SELECT * FROM `zawodnicy` WHERE `id` = '$i'");

Po co pobrałeś rekordy jeśli z nich nie korzystasz :/

$result1 = pobierz wszystkich zawodnikow
foreach($result1 as $v){
$result2 = pobierz zawodnika gdzie drużyna!=$v[druzyna]
para: $v[imie] $result2[imie]
}
Xart
Dzięki wielkie ale coś nadal mi nie działa....

  1. <?php
  2. include('inc/config.php');
  3. $result1 = $mysqli->query("SELECT * FROM `zawodnicy` ORDER BY id");
  4. foreach($result1 as $v){
  5. $result2 = $mysqli->query("SELECT * FROM `zawodnicy` WHERE `druzyna` != $v['druzyna']");
  6. echo("."$v['nazwa']." vs ."$result2['nazwa']."");
  7. }
  8. ?>
Turson
gdzie jest fetch_assoc? a w drugim fetch row
Xart
Fakt ...

Poprawiłem i wyświetla ale nie tak jak chce ;/

  1. <?php
  2. include('inc/config.php');
  3. $result1 = $mysqli->query("SELECT * FROM `zawodnicy` order by id");
  4. foreach($result1 as $v){
  5. $i = $v['druzyna'];
  6. $result2 = $mysqli->query("SELECT * FROM `zawodnicy` WHERE `druzyna` != '$i' ");
  7. $wynik2 = $result2->fetch_assoc();
  8. echo $v['nazwa'];
  9. echo ' vs ';
  10. echo $wynik2['nazwa'];
  11. echo '<br>';
  12. }
  13. ?>


Łukasz vs Rafał
Rafał vs Łukasz
Dominik vs Rafał
Kuba vs Łukasz
Diana vs Rafał
Krystian vs Łukasz
Marian vs Łukasz
Szuh vs Rafał

Każdy zawodnik może walczyć z każdym tylko jeden raz i ma to być dobrane losowo a nie wszystkie kombinacje

Czyli jak masz np 8 zawodników to powinny wylosować się 4 walki
np numery
1-4
5-8
2-3
6-7
albo
1-3
2-4
5-7
6-8

ITP a nie tutaj każdy walczy z każdy...
;/

Oczywiście ma to być poprostu losowanie...
Dowolnie ma wylosować zawodników do siebie i tyle aby nie byli w tej samej drużynie chyba że nie ma innej możliwości
nospor
Napisalem ci jak to zrobic.Czemu nie zrobisz jak napisalem?
Xart
Bo nie rozumiem tego co napisałeś - jak ty byś chciał to sprawdzać i kompletnie nie wiem jak zacząć. Mógłbyś mi to opisać krok po kroku z fragmentami kodu ? Byłbym bardzo wdzieczny nie zalezy mi zbytnio na czasie ale analizujac ten kod bym sie nauczył. Sory za błędy - tele
nospor
Masz napisane:
"Losujesz pierwszego, potem dla niego szukasz drugiego z innego klubu."
Czego tu nie rozumiesz?
Masz napisac zapytanie, ktore wylosuje ci jednego uzytkownika. Potem masz napisac zapytanie, ktore wylosuje tez jednego uzytkownika, ale z innego klubu.
Wszelkie niezbedne informacje jak to sie robi napisalem ci.
Operacje te powtarzasz tyle razy ile razy cchesz miec par.

Oczywiscie w kazdym zapytaniu musi sie znalezc warunek, by nie losowal wylosowanych juz userow. Ale to jest proste, bo wylosowanych userow bedziesz zapisywal w tablicy php a potem do kazdego zapytania przekazywal ID wylosowanych userow by nie bral ich pod uwage
Xart
Tak tylko dla mnie nie jest to takie proste :/ moglbys mi takie cos napisac ?
nospor
zapytanie losujace uzytkownia ci podalem
zapytanie losujace uzytkownika z innnej grupy tez ci podalem

W tej chwili masz poprostu lenia. Dopoki sie go nie pozbedziesz, nie licz na pomoc.
Xart
... ze co ? Ja nie mam lenia tongue.gif podaj mi jeszcze raz te zapytania bo jakos nie widze...
nospor
...order by rand() limit 1
.......WHERE ID_DRUZYNY<>ID_DRuZYNY_KOLESIA_DLA_KTOREGO_SZUKASZ ....
Xart
Powiedz mi jeszcze czy da sie to zrobic jakos petlą zeby skrypt dzialal dobrze niezaleznie od liczby rekordow. Jak zapisac wylosowane id do tablicy i jak sprawdzic czy to id w tablicy juz jest. smile.gif
nospor
PObierasz liczbe rekordow, dzielisz przez dwa i masz liczbe par
Jak zapisac w php cos do tablicy? Odnosze wrazenie ze ty sie cofasz, zamiast isc do przodu.... zajrzyj do manuala, tam takie podstawy są podane smile.gif
Xart
Bo dawno nic nie pisałem i może dlatego... jak bede po 21 na kompie sproboje to zrobic.

Witam... napisałem na razie takie coś i odrazu pytam czy to zadziała na takiej zasadzie jak chce to po 1.
Po 2 nie wiem jak w zapytaniu SQL sprawdzić że id nie ma w tablicy
Po wykonaniu zapytań muszę do tej tablicy zapisać zmienne $uzyteid1 i $uzyteid2
Co wy na to ?


  1. <?php
  2. include('inc/config.php');
  3. $ilosc = 4; //ILOŚĆ PRAR
  4. for($i=1; $i>=$ilosc; $i++;){
  5. $spr1 = $mysqli->query("SELECT * FROM `zawodnicy` WHERE `id` <> 'TABLICA' ORDER BY rand() LIMIT 1");
  6. $wynik1 = $spr1->fetch_assoc();
  7. $druzyna1 = $wynik1['druzyna'];
  8. $nazwa1 = $wynik1['nazwa'];
  9. $uzyteid1 = $wynik1['id'];
  10. $spr2 = $mysqli->query("SELECT * FROM `zawodnicy` WHERE `id` <> 'TABLICA' AND `druzyna` <> '$druzyna1' ORDER BY rand() LIMIT 1");
  11. $wynik2 = $spr2->fetch_assoc();
  12. $nazwa2 = $wynik2['nazwa'];
  13. $uzyteid2 = $wynik2['id'];
  14. echo $nazwa1;
  15. echo ' vs ';
  16. echo $nazwa2;
  17. echo '<br>';
  18. }
  19. ?>


Nie wiem, nie mam już pomysłów próbowałem to robić różnymi sposobami nawet tablice sortować czyli

  1. <?php
  2. $sortowane = array();
  3. $wszyscy = mysql_query("SELECT * FROM zawodnicy ORDER BY druzyna");
  4. $wszyscy = mysql_fetch_array($wszyscy);
  5. foreach ($wszyscy as $k=>$v){
  6. $sortowane[$v['druzyna' ]][] = $v;
  7. $losuj = array_rand ($sortowanie, 2);
  8. }
  9. ?>


Nie wiem, nie mam pojęcia jak to ugryźć byłbym wdzięczny, gdyby ktoś zechciał mi ten skrypt napisać...

Pozdrawiam
nospor
  1. include('inc/config.php');
  2. $ilosc = 4; //ILOŚĆ PRAR
  3. $bylo = array(0);
  4. for($i=1; $i>=$ilosc; $i++;){
  5. $spr1 = $mysqli->query("SELECT * FROM `zawodnicy` WHERE `id` not in (".implode(',',$bylo).") ORDER BY rand() LIMIT 1");
  6. $wynik1 = $spr1->fetch_assoc();
  7. $druzyna1 = $wynik1['druzyna'];
  8. $bylo[]=$wynik1['id']; //BYLO
  9. $nazwa1 = $wynik1['nazwa'];
  10. $uzyteid1 = $wynik1['id'];
  11. $spr2 = $mysqli->query("SELECT * FROM `zawodnicy` WHERE `id` not in (".implode(',',$bylo).") AND `druzyna` <> '$druzyna1' ORDER BY rand() LIMIT 1");
  12. $wynik2 = $spr2->fetch_assoc();
  13. $nazwa2 = $wynik2['nazwa'];
  14. $bylo[]=$wynik2['id']; //BYLO
  15. $uzyteid2 = $wynik2['id'];
  16. echo $nazwa1;
  17. echo ' vs ';
  18. echo $nazwa2;
  19. echo '<br>';
  20. }
Xart
Dzięki wielkie ale rozwiazałem to w trochę inny sposób smile.gif
Można zamknąć:

Mój KOD

  1. <?php
  2. include('inc/config.php');
  3. ini_set('display_errors', '1');
  4. for($i = 1; $i <= 4; $i++){
  5. $spr1 = $mysqli->query("SELECT * FROM `zawodnicy` WHERE `status` = '0' ORDER BY rand() LIMIT 1");
  6. $wynik1 = $spr1->fetch_assoc();
  7. $id1= $wynik1['id'];
  8. $mysqli->query("UPDATE `zawodnicy` SET status='1' WHERE id='$id1'");
  9. $druzyna1 = $wynik1['druzyna'];
  10. $nazwa1 = $wynik1['nazwa'];
  11. $spr2 = $mysqli->query("SELECT * FROM `zawodnicy` WHERE `status` = '0' AND `druzyna` != '$druzyna1' ORDER BY rand() LIMIT 1");
  12. $wynik2 = $spr2->fetch_assoc();
  13. $id2 = $wynik2['id'];
  14. $mysqli->query("UPDATE `zawodnicy` SET status='1' WHERE id='$id2'");
  15. $nazwa2 = $wynik2['nazwa'];
  16. echo $nazwa1;
  17. echo ' vs ';
  18. echo $nazwa2;
  19. echo '<br>';
  20. }
  21. ?>
  22.  
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.