Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Problem z napisaniem skryptu
Forum PHP.pl > Forum > Przedszkole
QoooQ
dobry wieczór potrzebuje napisać skrypt który w formularzu (typ select) będzie w losowej kolejności wyświetlać dni tygodnia. niestety już na początku pojawiają się problemy questionmark.gif z góry mówię pierwszy raz próbuję napisać własną 'funkcje'..
  1. function losowa_liczba()
  2. {
  3. $losowa_liczba = rand(1,7);
  4. return $losowa_liczba;
  5. }
  6. array($tablica);
  7.  
  8. losowa_liczba();
  9.  
  10. if(!in_array(losowa_liczba(), $tablica))
  11. {
  12. $tablica = implode(',',losowa_liczba());
  13. }


błąd jest w liniach z in array i implode.

Błędy ->

Warning: in_array() [function.in-array]: Wrong datatype for second argument in E:\VertrigoServ\www\test.php on line 26

Warning: implode() [function.implode]: Invalid arguments passed in E:\VertrigoServ\www\test.php on line 28
Daiquiri
Przetłumacz sobie na j. polski: drugi argument ma zły typ (linia 26) no i zły argument w funkcji implode(). Nie bardzo rozumiem co Ty kombinujesz z in_array. Przecież wylosowałeś już "dzień" za pomocą rand() i zwracasz go w funkcji losowa_liczba.

I jeszcze jedno: po co Ci funkcja, która zwraca losową liczbę? Przecież wystarczy Ci rand(). Chyba, że to tak dla sportu.
blahy
to moze w ramach pomocy Twoj kod z kometarzami:
  1. <?php
  2.  
  3. //funkcja zwraca losiwa liczbe calkowita z zakresu od 1 do 7
  4. function losowa_liczba()
  5. {
  6. $losowa_liczba = rand(1,7);
  7. return $losowa_liczba;
  8. }
  9.  
  10. var_dump($tablica);
  11. array($tablica); //tworzysz tablice, ktorej zawartoscia jest NULL bo zmienna $tablica nie zostala zainicjowana
  12. //nigdzie nie zapisujesz wyniku operacji. linijka nizej zapamietuje to co zrobiles
  13. $twojaTablica = array($tablica);
  14. var_dump($twojaTablica); //jak widac utworzyles tablice z jednym elementem NULL
  15.  
  16. losowa_liczba(); //wywolujesz funkcje ktora zwraca losowa liczbe ale nigdzie nie zapamietujesz ani nawet go nie wyswietlasz
  17. //ponizej przyklad:
  18. $wylosowanaLiczba = losowa_liczba(); //zapisanie wyniku dzialania funkcji do zmiennej
  19. var_dump($wylosowanaLiczba); //wypisanie zapamietanej linijke wczesniej liczby
  20.  
  21.  
  22. if(!in_array(losowa_liczba(), $tablica)) //nie dziala bo zmienna $tablica nie jest nawet tablica tylko NULLem co mozna wyczytac wprost z warning: in_array() expects parameter 2 to be array, null given - drugi parametr ma byc tablica, a jest null
  23. {
  24. $tablica = implode(',',losowa_liczba()); //tutaj juz nie mam pojecia co chciales osiagnac, ale musisz sobie zdawac sprawe ze kazde wywolanie funkcji losowa_liczba() zwraca nowa losowa liczbe. jesli chcesz wylosowac raz musisz zapisac wynik dzialania funckji do zmiennej i uzywac tej zmiennej tak jak pokazalem wyzej
  25. //po drugie implode laczy w jeden string (tutaj oddzielony przecinkami) elementy tablicy podany jako 2 argument (Ty podajesz liczbe) co jest sygnalizowane przez warning: [function.implode]: Invalid arguments passed - podano nieprawidlowe parametry
  26. }
  27.  
  28. //jesli dobrze rozumiem to chcesz osiagnac w wyniku tablice ktora posiada liczby od 1 do 7 w nieuporzadkowwnaj kolejnosci. nie latwiej zrobic to tak?:
  29. $tablica = array(1,2,3,4,5,6,7); //albo w forze
  30. shuffle($tablica); //wymieszaj elementy tablicy
  31. var_dump($tablica); //wynik to np. array(7) { [0]=> int(4) [1]=> int(5) [2]=> int(2) [3]=> int(6) [4]=> int(1) [5]=> int(3) [6]=> int(7) } //jak potrzebujesz to w stringu to teraz mozesz potraktowac ta tablice funkcja implode()


Podsumowujac: jak zabierasz sie za nowy temat przeczytaj rozdzial ksiazki/manuala albo jakis tutorial z nim zwiazany
komunikaty (warningi noticey, errory) daja duzo cennych informacji. var_dumpuj dane przed wywolaniem funkcji zeby sie przekonac czy jest w nich to co rzeczywiscie chcesz.
jesli info dotyczy konkretnej funkcji przeczytaj manuala wraz z przykladami zwracajac uwage na parametry, ich typy, zwracana wartosc, czy jest referencja itp.
bez debugowania kodu nie liczylbym na to ze napisze cos nowego i bedzie od razu dzialac
bastard13
Błąd 1) drugi przekazany parametr złego typu
Błąd 2) właściewie, to samo.
Polecam przede wszystkim odrobinę nauki angielskiego, bo dzięki jego znajomości nie będziesz miał pytań tego typu.
Poza tym, co mają robić te dwie linijki:
  1. array($tablica);
  2. losowa_liczba();

bo w tej chwili, to raczej nic pożytecznego. I skąd w array($tablica); zmienne $tablica?
QoooQ
hmm wielkie dzięki .. smile.gif
użyłem array(tablica) poniewaz chcialem zdeklarować że zmienna w ogóle istnieje , nie jestem pewien ale gdybym tego nie użył to wywaliło by NOTICE

hmm czy takie rozwiązanie może być ?
  1. $tablica = array(1,2,3,4,5,6,7);
  2. shuffle($tablica);
  3. //print_r($tablica);
  4. //var_dump($tablica);
  5.  
  6. $suma = count($tablica)-1;
  7.  
  8. for($l = 0;$l <= $suma;++$l)
  9. {
  10.  
  11. switch($tablica[$l])
  12. {
  13. case 1:
  14. $dzien = 'Wtorek';
  15. break;
  16.  
  17. case 2:
  18. $dzien = 'Środa';
  19. break;
  20.  
  21. case 3:
  22. $dzien = 'Czwartek';
  23. break;
  24.  
  25. case 4:
  26. $dzien = 'Piątek';
  27. break;
  28.  
  29. case 5:
  30. $dzien = 'Sobota';
  31. break;
  32.  
  33. case 6:
  34. $dzien = 'Niedziela';
  35. break;
  36.  
  37. default:
  38. $dzien = 'Poniedziałek';
  39. break;
  40. }
  41.  
  42. echo $tablica[$l],'/',$dzien,'<br/>';
  43.  
  44. }
DowNlOaD_
jesli chcesz funkcje co losuje ci dzien tygodnia slownie to prosze:

Kod
function RandomDay()
{
$days = array("Poniedzialek", "Wtorek", "Sroda", "Czwartek", "Piatek", "Sobota", "Niedziela");
return $days[rand(0, 6)];
}


//edit: rand(0, 6) a nie rand(0, 7), pomylka w kodzie winksmiley.jpg
franki01
Dwie pierwsze linijki są kluczowe, ale już nawet zamiast liczb możesz dać dni.
  1. $tablica = array('Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota', 'Niedziela');
  2. shuffle($tablica);
  3. echo implode('<br />', $tablica);


To działa prawie tak samo jak Twoje, tyle że nie dopisuje liczby ze slashem na początku linijek. Możesz je dodać bezpośrednio do tablicy:
  1. $tablica = array('1/Poniedziałek', '2/Wtorek', '3/Środa', '4/Czwartek', '5/Piątek', '6/Sobota', '7/Niedziela');



EDIT, @UP:
Zamiast rand() używaj mt_rand(). Wg dokumentacji jest czterokrotnie szybsze, a rezultaty są takie same.
blahy
a nie latwiej tak?
  1. <?php
  2. $tablica = array(1 => 'poniedzialek',2 => 'wtorek',3 => 'sroda',4 => 'czwartek',5 => 'piatek',6 => 'sobota',7 => 'niedziela');
  3. shuffle($tablica);
  4.  
  5. foreach($tablica as $dzien)
  6. {
  7. echo $dzien.'<br>';
  8. }

Poswiec temu co napisalismy troche wiecej czasu niz 10 minut winksmiley.jpg
bastard13
A nie lepiej:
  1. $days=array('poniedziałek','wtorek',...);
  2. shuffle($days);
  3. echo implode('<br>',$days);

Efekt taki sam:)

@up:
To się nazywa szybki odzew:)
franki01
Cytat(bastard13 @ 24.09.2010, 22:21:57 ) *
A nie lepiej:
  1. $days=array('poniedziałek','wtorek',...);
  2. shuffle($days);
  3. echo implode('<br>',$days);

Efekt taki sam:)


Napisałem wyżej to samo. Otwórz oczy! smile.gif

EDIT:
Nie nadążam z tym co tu się dzieje tongue.gif
QoooQ
no tak tylko że ja potrzebuje tez nr klucza..
próbowałem tak:
  1. <?php
  2.  
  3. if(isset($_POST['dzien']))
  4. {
  5. $dzien = abs($_POST['dzien']+1);
  6.  
  7. echo $dzien,'/',date('w');
  8.  
  9. if($dzien == date('w'))
  10. {
  11. echo '<span>poprawny</span>';
  12. }
  13. else
  14. {
  15. echo '<span>źle</span';
  16. }
  17.  
  18. }
  19.  
  20. $tablica = array(1 => 'poniedzialek',2 => 'wtorek',3 => 'sroda',4 => 'czwartek',5 => 'piatek',6 => 'sobota',7 => 'niedziela');
  21. shuffle($tablica);
  22.  
  23.  
  24.  
  25. echo 'Jaki dziś mamy dzień tygodnia ?<form action="" method="POST" onsubmit="return toWin(this)"><select name="dzien">';
  26.  
  27. foreach($tablica as $nr_dzien => $nazwa_dzien)
  28. {
  29. echo '<option value="'.$nr_dzien.'">'.$nazwa_dzien.'('.$nr_dzien.')</option>';
  30. }
  31. echo '</select>&nbsp;<INPUT type="submit" value="Potwierdź"></form>';
  32. ?>

ale zauważyłem że coś nie działa i wyszło że problem nr_dzien zawiera liczbe ale nie klucz tablicy tylko tak jak by przy każdym wywołaniu forecha zwieksza o +1 ,co zrobić aby w option value wstawić nr klucza ?
franki01
  1. $tablica = array(1,2,3,4,5,6,7);
  2. shuffle($tablica);
  3. $dni = array(1 => 'Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota', 'Niedziela');
  4. foreach($tablica as $k => $v)
  5. {
  6. if($k > 0) echo '<br />';
  7. echo $v . '/' . $dni[$v]; # format: 1/Poniedziałek
  8. }
QoooQ
o super działa , wielkie dzięki smile.gif
tylko jeszcze takie pytanko.. skrypt ma słuzyć autoryzacji , tzn co 45min jego zadaniem jest pojawianie się , wadą tego jest to że użytkownik może sobie w innej zakładce ustawić autoodświeżanie (już po wysłaniu forma) więc cały co 45 min automatycznie będzie miał autoryzowane .. jakiś pomysł jak zrobić aby takie rozwiązanie nie przeszło questionmark.gif

hmm wpadłem na coś takiego:
  1. <?php
  2.  
  3. if(isset($_POST['dzien_'.$_SESSION['ll'].'']))
  4. {
  5.  
  6. $dzien = abs($_POST['dzien_'.$_SESSION['ll'].'']);
  7.  
  8. if($dzien == date('w'))
  9. {
  10. echo '<span>poprawny</span>';
  11. }
  12. else
  13. {
  14. echo '<span>źle</span';
  15. }
  16.  
  17. }
  18.  
  19. $tablica = array(1,2,3,4,5,6,7);
  20. shuffle($tablica);
  21. $dni = array(1 => 'Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota', 'Niedziela');
  22.  
  23. $losowa = rand(1,100);
  24. $_SESSION['ll'] = $losowa;
  25.  
  26. echo 'Jaki dziś mamy dzień tygodnia ?
  27. <form action="" method="POST" onsubmit="return toWin(this)">
  28. <select name="dzien_'.$losowa.'">';
  29.  
  30. foreach($tablica as $k => $v)
  31. {
  32. echo '<option value="'.$v.'">'.$dni[$v].'</option>';
  33. }
  34. echo '</select>&nbsp;<INPUT type="submit" value="Potwierdź"></form>';
  35.  
  36. ?>

działac działa czyli po odświeżeniu strony nic się nie dzieje (taki post nie istnieje ;]) ale czy to jest poprawnie , nie będzie komplikacji.. (chodzi mi dokładnie o to:
  1. if(isset($_POST['dzien_'.$_SESSION['ll'].'']))
  2. $dzien = abs($_POST['dzien_'.$_SESSION['ll'].'']);

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.