Jakie są możliwości jednorazowego wykonania array_rand(). Mam skrypt który pobiera id z MySQL, następnie losuje 10 rożnych id i przypisuje je do następnych zapytań. Zależy mi na tym, by po jednorazowym wylosowaniu, czyli uruchomieniu się skryptu(wejściu na stronę) nie odświeżeniu wylosowane id było niezmienne. I teraz wiem, że mam do wyboru przenoszenia już wylosowanych id za pomocą funkcji header(), tylko zastanawiam się czy istnieje jeszcze jakiś ładny mniej zasobożerny sposób?.
oto mój skrypt:
$query_id_question = "SELECT id_question FROM questions WHERE number='".$return['number']."'"; = $db-query($query_id_question); ($return_id_q = $result_id_q-fetch_row()) { $id_question[] = $return_id_q[0]; }
Nie wiem, czy dobrze Cię zrozumiałem, bo Twoja interpunkcja jest tragiczna (trzecie zdanie), ale może rozwiązaniem jest użycie sesji (session_start) i trzymanie wartości w tablicy $_SESSION?
P.S. Uważaj z funkcją array_rand, bo zwraca ona tablicę z wylosowanymi indeksami do tablicy z której losuje, a nie wartości elementów z tej tablicy!
Ok, wcześniejszą kwestię rozwiązałem, mam tylko takie techniczne pytanie dotyczące zapisywania wyniku mysql_fetch do zmiennej sesyjnej. Dlaczego poniższy skrypt po wykonaniu pętli aktualizuje wartość zapisaną w zmiennej sesyjnej :?: ?
($return_id_q = $result_id_q-fetch_row()) { $_SESSION['id_question'] = array($return_id_q[0]); }[/code]
Domyślam się, że po każdym wykonaniu pętli zmienna sesyjna tworzy się na nowo i zapisuję ostatni wynik wykonanej pętli, dobrze myślę :?:.
Poradziłem sobie z powyższym mankamentem w ten sosób:
[code=php]($return_id_q = $result_id_q-fetch_row()) { $r_i_q[] = $return_id_q[0]; }
Dokładnie. Oczywiście wcześniej inicjujesz zmienną $r_i_q jako tablicę:
$r_i_q = array();
I jeszcze jedna uwaga: gdzieś kiedyś wyczytałem, że nie wolno trzymać tablic w zmiennych sesyjnych (oraz innych złożonych obiektów) i aby to robić, trzeba używać funkcji serialize() do zakodowania tablicy jako string, a potem funkcji unserialize() do jego rozkodowania. Ale ta uwaga mogła dotyczyć jakiejś starej wersji PHP - obecnie chyba tym nie trzeba się przejmować (poza obiektami, ale to inna sprawa).
$r_i_q[] = to nie jest inicjalizacja, tylko dodanie do tablicy kolejnej pozycji (indeks automatycznie się zwiększa). Warto zadbać o to, by zmienna taka była tablicą (pustą).
Tak się dzieje, ponieważ zmienna nie jest niezainicjowana (przy pierwszym przypisaniu), wiec interpreter przyjmuje, że jest ona zmienną tablicową. Ale takie podejście może kiedyś doprowadzić do błędu, który będzie trudno zlokalizować - warto w programowaniu trzymać się dobrych, sprawdzonych zasad/praktyk.
Z tego co się orientuję, to nie ma takiej uniwersalnej funkcji, to co napisałeś się nadaje (ale tylko do Twojego przykładu, gdzie wewnętrzna tablica - 2. rzędu - ma tylko jeden element).
P.S. Pamiętaj, że przy takim “spłaszczeniu” tablicy wielowymiarowej do jednowymiarowej trzeba uważać na powtarzające się elementy - należy odpowiednio napisać kod tak, by otrzymać to co się oczekuje (np. u Ciebie w powyższym przykładzie, jakbyś miał drugą liczbę 8 - zamiast tej 9, to otrzymasz tablicę 2-elementową z dwiema ósemkami).