Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Losowanie w Array
Forum PHP.pl > Forum > Przedszkole
mperlam
Cześć. Mam niewielki problem. Zrobiłem krótki kod, który losuje z Array (w tym przypadku jest to zmienna $ploginlist) a następnie zapisuje listę do pliku txt, po siedmiu dniach plik jest czyszczony i losowanie odbywa się jeszcze raz. Wszystko jest ok ale chciałbym zrobić tak, że w siódmy dzień do losowania nie przystępuje login, który był na samym dole (czyli na miejscu siódmym) w pliku txt i automatycznie jest wklejany na miejscu szóstym.

Oto krótki wycinek z kodu. Bardzo proszę o pomoc w jego dokńczeniu

  1. $dane = file("llist.txt");
  2. $dan = trim($dane[6]);
  3. $poz = array_search($dane[6], $ploginlist);
  4. unset($ploginlist[$poz]);
  5. echo $dan;
  6. $ploginlist["ost"] = "$dan";
  7. echo $ploginlist["ost"];
  8. file_put_contents("llist.txt", '');
  9. $randl = array_rand($ploginlist, 6);
  10. $f = fopen("llist.txt", "a");
  11. $lp=1;
  12. $l=0;
  13. while (7 >= $lp) {
  14. fputs($f, $ploginlist[$randl[$l]]."\n");
  15. $l++;
  16. $lp++;
  17. }
  18. fputs($f, $dan."\n");
  19. fclose($f);
thomson89
Pobierasz ilość elementów tablicy. Potem przepisujesz tablicę w while, lub for pomijając ostatni element.
mperlam
Elementów jest zawsze tyle samo, pętle jak widzisz już dawno mam, nie chcę pomijać ostatniego elementu tylko element znajdujący się na ostatnim miejscu w array (a to jest istotna różnica bo array chcę modyfikować). Liczę na pomoc w poprawieniu kodu a nie wytłumaczenia co mam zrobić (bo to doskonale wiem)
thek
Jeśli dobrze rozumię... Masz plik, który ma 7 pozycji zawsze. Otwierasz go, chcesz zabrać ostatni element a z reszty wylosować miejsca od 1 d 5 oraz 7, bo ów ostatni wchodzi z góry na miejsce 6? To czemu nie zrobisz tak jak algorytmicznie pisze? winksmiley.jpg
1. Odczytujesz cały plik jako tablicę rekordów.
2. Ostatni element usuwasz z tablicy i zapisujesz w tempie
3. Resztę sobie randomowo mieszasz.
4. Z tempa wyciągasz element i wciskasz go przed ostatni element.

Jako że nie ma akurat gotowej funkcji by zrobić punkt 4 to musisz go zrobić "na około". Można choćby dokleić kopię tego z tempa i potem do owego klucza przepisać wartość ostatniego elementu, a w miejsce stare wrzucić wartość z tempa. Do użycia: shuffle, array_pop jako przydatne funkcje.
mperlam
Źle rozumiesz smile.gif Nie chce losowac zawartości pliku tylko zawartość array (której nazwę podalem w pierwszym poście). Z pliku chce zostawić ostatni wypisany tekst (czyli w linijce nr 7)
thek
No to różnica minimalna. Jedynie tyle, że bierzesz z pliku sobie ostatni element, usuwasz go z tablicy podstawowej a reszta to samo. Więc algorytm się zmienia na mniej więcej:
1. Pobrać wyniki z pliku jako tablicę.
2. Zapamiętać ostatni.
3. Usunąć zapamiętany z tablicy wybranej do losowania.
4. Przetasować tę tablicę i wziąć pierwszych/ostatnich 6 (shuffle już nam wystarczająco randoma zrobi).
5. Zapamiętany element wciskasz przed ostatni element.

Zmiana niemal żadna z algorytmicznego punktu widzenia. Jedynie zmieniliśmy źródło danych minimalnie. Czy tak trudno byłoby samemu na to wpaść?
mperlam
smile.gif Udało się, nie trzbe abyło kombinować tongue.gif Skrypt który podałem działa, wystarczyło dać $l++ za warunkiem if 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.