Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Losowanie jednej liczby z kilku podanych.
Giluś
post
Post #1





Grupa: Zarejestrowani
Postów: 377
Pomógł: 9
Dołączył: 2.11.2010

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


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 ?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 16)
Swirek
post
Post #2





Grupa: Zarejestrowani
Postów: 221
Pomógł: 20
Dołączył: 4.05.2006
Skąd: Polska

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


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?


--------------------
Macho odpadacie ;) .
Go to the top of the page
+Quote Post
Giluś
post
Post #3





Grupa: Zarejestrowani
Postów: 377
Pomógł: 9
Dołączył: 2.11.2010

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


Nie jestem jakimś geniuszem w tych sprawach, próbowałem kilku rzeczy, ale żadna nie działa..
Go to the top of the page
+Quote Post
Swirek
post
Post #4





Grupa: Zarejestrowani
Postów: 221
Pomógł: 20
Dołączył: 4.05.2006
Skąd: Polska

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


  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


--------------------
Macho odpadacie ;) .
Go to the top of the page
+Quote Post
pianta_d
post
Post #5





Grupa: Zarejestrowani
Postów: 176
Pomógł: 18
Dołączył: 5.01.2007

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


A tutaj masz wybór tylko z tablicy

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


Pozdrawiam
Go to the top of the page
+Quote Post
blooregard
post
Post #6


Newsman


Grupa: Moderatorzy
Postów: 2 033
Pomógł: 290
Dołączył: 21.12.2007
Skąd: Łódź




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;



--------------------
Life's simple... You make choices and don't look back...
Go to the top of the page
+Quote Post
pianta_d
post
Post #7





Grupa: Zarejestrowani
Postów: 176
Pomógł: 18
Dołączył: 5.01.2007

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


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
Go to the top of the page
+Quote Post
Giluś
post
Post #8





Grupa: Zarejestrowani
Postów: 377
Pomógł: 9
Dołączył: 2.11.2010

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


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





Grupa: Zarejestrowani
Postów: 176
Pomógł: 18
Dołączył: 5.01.2007

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


Opis funkcji mysql_fetch_array znajdziesz w manualu
Go to the top of the page
+Quote Post
blooregard
post
Post #10


Newsman


Grupa: Moderatorzy
Postów: 2 033
Pomógł: 290
Dołączył: 21.12.2007
Skąd: Łódź




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


--------------------
Life's simple... You make choices and don't look back...
Go to the top of the page
+Quote Post
kpt_lucek
post
Post #11





Grupa: Zarejestrowani
Postów: 428
Pomógł: 77
Dołączył: 10.07.2011
Skąd: Warszawa

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


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.)

Ten post edytował kpt_lucek 12.10.2011, 16:45:13


--------------------


Cytat
There is a Bundle for that
Lukas Kahwe Smith - October 31th, 2014
Go to the top of the page
+Quote Post
pianta_d
post
Post #12





Grupa: Zarejestrowani
Postów: 176
Pomógł: 18
Dołączył: 5.01.2007

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


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
Go to the top of the page
+Quote Post
Giluś
post
Post #13





Grupa: Zarejestrowani
Postów: 377
Pomógł: 9
Dołączył: 2.11.2010

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


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...

Go to the top of the page
+Quote Post
blooregard
post
Post #14


Newsman


Grupa: Moderatorzy
Postów: 2 033
Pomógł: 290
Dołączył: 21.12.2007
Skąd: Łódź




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.


--------------------
Life's simple... You make choices and don't look back...
Go to the top of the page
+Quote Post
pianta_d
post
Post #15





Grupa: Zarejestrowani
Postów: 176
Pomógł: 18
Dołączył: 5.01.2007

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


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





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




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.


--------------------
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
Giluś
post
Post #17





Grupa: Zarejestrowani
Postów: 377
Pomógł: 9
Dołączył: 2.11.2010

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


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
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 - 13:44