Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Losowanie jednej liczby z kilku podanych.
Forum PHP.pl > Forum > Przedszkole
Giluś
Cześć mam pytanie, jak wylosować Jedną cyfrę z podanych kilku.
Wyszukuję na początku wszystkie id z moimi warunkami (WHERE) następnie dodaje je do pętli while i odczytuję wszystkie ID
  1. $id['id']
.
I teraz mam pytanie jak wylosować jedno z tych ID ?

Chciałem zrobić tak:
  1. $input = array($id);
  2. $id2 = array_rand($input, 1);


Ale wyskakuję tylko: " 00 "

Wiem, że to pewnie przez to, że źle się tworzy tablica, ale jak ją zrobić poprawnie ?
Swirek
ale w trakcie już odczytywania w pętli while nie możesz ich ładować do tablicy pod kolejnymi id.
i później robić array rand na tej tablicy?
Giluś
Nie jestem jakimś geniuszem w tych sprawach, próbowałem kilku rzeczy, ale żadna nie działa..
Swirek
  1.  
  2. $tablica = array();
  3. $liczby2=mysql_query("SELECT id FROM liczby");
  4. while($liczby = mysql_fetch_array($liczby2)) {
  5. $tablica[] = $liczby["id"];
  6. }
  7.  
  8. $losowe = array_rand ($tablica, 1);
  9.  


pisane z palca chyba zadziała smile.gif
mam nadzieję że pomogłem
pianta_d
A tutaj masz wybór tylko z tablicy

  1. <?php
  2. $tablica = array($id);
  3. echo $tablica[array_rand($tablica)];
  4. ?>


Pozdrawiam
blooregard
A nie prościej zrobić to już na etapie zapytania SQL?

  1. SELECT id FROM tabela WHERE [ Twój_warunek ] ORDER BY RAND LIMIT 1;

pianta_d
Nie no spoko @blooregard, ale nie wiemy czy @Giluś używa bazy danych jako źródła dla tablicy.
Ja podałem swój sposób jako alternatywę dla Twojego

Pozdrawiam
Giluś
Ano własnie nie, bo nie wiem dlaczego omija mi drugi warunek...

Mam taki warunek:
  1. WHERE kolizjaokr = 0 AND kolizja != Jan

Wiec szuka id który ma kolizjaokr = 0 a kolizja jest inne niż Jan, działa bardzo dobrze 1 warunek, natomiast drugi już nie, sam nie wiem dlaczego, wiec chciałem spróbować coś innego.


A dodatkowo, czy można zamienić w jakiś inny sposób " mysql_fetch_array " ?, ponieważ mam troszkę dziwny skrypt forum - SMF 2 i posiada on swoje funkcję mysql np.:
  1. $smcFunc['db_query']('', 'SELECT * FROM {db_prefix}cos_tam',
  2. )
  3. );
  4.  
  5. while ($row = $smcFunc['db_fetch_assoc']($row)){ }

A w internecie znalazłem, że nie ma takiej funkcji jak: mysql_fetch_array, wiec pytam sie czy da się ją jakoś zastąpić ?
pianta_d
Opis funkcji mysql_fetch_array znajdziesz w manualu
blooregard
Cytat(Giluś @ 12.10.2011, 17:32:44 ) *
A w internecie znalazłem, że nie ma takiej funkcji jak: mysql_fetch_array, wiec pytam sie czy da się ją jakoś zastąpić ?


Coś słaby ten Twój internet:
http://pl2.php.net/mysql_fetch_array
kpt_lucek
Cytat(Giluś @ 12.10.2011, 17:32:44 ) *
[...]
A w internecie znalazłem, że nie ma takiej funkcji jak: mysql_fetch_array, wiec pytam sie czy da się ją jakoś zastąpić ?

mysql_fetch_array()

co do problemu... spróbuj zrobić to na około jak nie masz pomysłu, czyli:
  1. //przykład (zakładając że już się połączyłeś z DB
  2. $sql = mysql_query("SELECT `id` FROM `nazwa_tabeli`");
  3.  
  4. // możesz sobie dodać zmienną i zrobić z niej tablice:
  5. $tablica = array();
  6. while($a = mysql_fetch_array($sql, MYSQL_ASSOC))
  7. {
  8. $tablica[] = $a[id];
  9. }
  10.  
  11. // tutaj skrypt losowania z gotowej tablicy
  12.  
  13. //$tablica <- Twoja tablica
  14. $random = array_rand($tablica, 1);
  15. echo $tablica[$random[0]];
  16. ?>


Powinno zadziałać (również pominięcie nowej tablicy etc.)
pianta_d
Ostatnio z @northwest w tym wątku szukaliśmy rozwiązania podobnego problemu i w końcu @northwest skorzystał z podobnej funkcji, którą polecił Ci @kpt_lucek
Giluś
Cytat(blooregard @ 12.10.2011, 17:39:13 ) *
Coś słaby ten Twój internet:
http://pl2.php.net/mysql_fetch_array



Mój internet jest znakomity, a twój chyba pomija niektóre rzeczy:

"A dodatkowo, czy można zamienić w jakiś inny sposób " mysql_fetch_array " ?, ponieważ mam troszkę dziwny skrypt forum - SMF 2 i posiada on swoje funkcję mysql np.: "

"A w internecie znalazłem, że nie ma takiej funkcji jak: mysql_fetch_array, wiec pytam sie czy da się ją jakoś zastąpić ?"

Może przeczytałeś to, a źle mnie zrozumiałeś, chodzi mi oto, że skrypt smf2 posiada swoje funkcję bezpieczeństwa i nie ma w niej mysql_fetch_array, dlatego chciałem to jakimś innym sposobem podmienić.


@pianta_d
Ogólnie mi chodzi obojętnie jakim sposobem wylosowanie tego ID, chciałem prostym sposobem własnie tym z MySQL, tylko nie wiem dlaczego on mi nie działa:
  1. SELECT * FROM {db_prefix}symf1_zawod WHERE kolizjaokr = 0 AND kolizja != Jan ORDER BY RAND() LIMIT 1

Działa np:
  1. SELECT id FROM {db_prefix}symf1_zawod WHERE kolizjaokr = 0 AND kolizja != Jan


Tak jak by przez ten RAND lub Limit...

blooregard
Cytat
Mój internet jest znakomity, a twój chyba pomija niektóre rzeczy:

"A dodatkowo, czy można zamienić w jakiś inny sposób " mysql_fetch_array " ?, ponieważ mam troszkę dziwny skrypt forum - SMF 2 i posiada on swoje funkcję mysql np.: "

"A w internecie znalazłem, że nie ma takiej funkcji jak: mysql_fetch_array, wiec pytam sie czy da się ją jakoś zastąpić ?"

Może przeczytałeś to, a źle mnie zrozumiałeś, chodzi mi oto, że skrypt smf2 posiada swoje funkcję bezpieczeństwa i nie ma w niej mysql_fetch_array, dlatego chciałem to jakimś innym sposobem podmienić.


Dziwne, że nie tylko ja Cię źle zrozumiałem, no ale pomińmy detale.
pianta_d
Ale dlaczego nie działa?
Ja na swoim localu próbuję coś takiego
  1. SELECT * FROM osoba WHERE plec = "KOBIETA" AND imie != "MARTA" ORDER BY RAND() LIMIT 1
zawsze losuje jedną kobietę o imieniu różnym od MARTA
thek
Może to jakaś starsza, dziwna wersja MySQL? Oprócz znanego != , można też użyć mniej popularnej wersji <> i może to zostanie złapane w bazie. Dopiero co przed chwilą w innym topicu podałem 2 wersje funkcji losujących z użyciem tylko i wyłacznie PHP. Popatrz, pomyśl, skorzystaj. Dla Twojego przypadku szybsze będzie użycie wersji pierwszej przerobionej, gdyż losujesz tylko jedną liczbę z zakresu. Możesz wtedy choćby użyć:
  1. shuffle( $tablica_z_id );
  2. $wylosowany = array_pop( $tablica_z_id );

ale programowanie ma to do siebie, że sposobów na zrobienie tego samego są dziesiątki nieraz i to co wyżej napisałem jest tylko wariantem spośród wielu. Radn w bazie na dużej tabeli, zarżnie ją. Spróbuj pobrać id, wylosować jeden i potem pobierz rekord o danym Id.
Giluś
Zrobiłem wielką gapę, a nawet ogromną i to przez swoją głupotę smile.gif.

Opiszę jaki błąd zrobiłem:

Mam bazę danych taką:
ID|Imie|czas|kolizjaokr|kolizja
1|Ja| |0| |
2|Ja2| |0| |

(kolizjaokr - to Kolizja na danym okrążeniu), (kolizja - to Nick z kim została dokonana kolizja)

I chciałem zrobić aby wylosował jedną osobę która kolizjaokr = 0 i kolizja jest inna niż moje imię.. - Ale co jakiś czas wychodziło i tak moje imię...
Rozmyślałem dlaczego tak się dzieje ...
Aż w końcu pomyślałem:

Przecież jak kolizja jest równa nic to != Ja będzie przechodziło smile.gif, bo przecież to działa tak: Jeśli kolizjaokr = 0 i "nic"(0) jest inne niż Ja to bierz pod uwagę również tą osobę.

I tak straciłem 1dzień myślenia nad tym czemu losuję mi moje imię, rozwiązanie to dodanie kolejnego warunku imie != Ja(mojeimie).


Co do optymalności to mi ogólnie nie zależy na tym bo i tak to będzie co najwyżej uruchamiane raz na jakiś czas (tylko przez administratora) a tych ID będzie maksymalnie (takie maksimum największe ) = 100.


Oczywiście dla każdego kto napisał odpowiedz w tym temacie poleci "Pomógł" smile.gif

Pozdrawiam i dziękuje za odpowiedzi smile.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.