Autor Zpráva
RErnst
Profil *
Zdravím,
sháním nějaký php script, kterými vybere z hodnot A a B a poté vypíše jen jednu z nich.
Jde mi o to, abych zadal několik hodnot, třeba rohlík,chleba a houska a poté by mi to vypsalo jen jednu z nich a když to obnovim, vypíše jinou.
LosFilipos
Profil
$pole = array("rohlik","houska","něco");
echo $pole[rand(0,count($pole))];
RErnst
Profil *
Bohužel nefunguje viz : http://spustit.cz/Novy1.php
LosFilipos
Profil
Chybka se vloudila...
$pole = array("rohlik","houska","něco");
echo $pole[rand(0,count($pole)-1)];

Na funckčnost to ovšem nemá zas tak velký vliv. Jen se jednou za čas nezobrazilo nic...

Funguje zde: www.kralici-hop.cz/test/
Alphard
Profil
[#4] LosFilipos
Podobné problémy si ušetříte funkcí array_rand().

RErnst:
Alternativně lze použít shuffle(), ale tady zřejmě nepřinese žádnou výraznou výhodu.
rernst
Profil *
a co tam znamená ta 0?
rernst
Profil *
A taky ještě jestli je možné to nějak ošetřit, aby to nebylo 2krát za sebou stejné?
LosFilipos
Profil
Mno jak napsal Alphard, funkce array_rand() řeší vlastně to, co jsem se snažil opsat, tudíž bych použil právě array_rand().

Ale v té mojí ukázce probíhá asi toto:
funkce rand() vybere náhodné číslo v rozmezí 0počet-prvků-z-pole-minus-1 a vypíše prvek z pole právě s tímto klíčem...
Protože prvky toho pole mají klíče následující
$pole[0]=rohlik
$pole[1]=houska
$pole[2]=něco
rernst
Profil *
a jak přesně to prosím udělat s array_rand()
LosFilipos
Profil
$pole = array("rohlik","houska","něco");
echo $pole[array_rand($pole)];


rernst:
A taky ještě jestli je možné to nějak ošetřit, aby to nebylo 2krát za sebou stejné?
Jelikož tohle vypisuje náhodné prvky z pole, tak ne.

Šlo by to udělat jinak, např. pomocí $_SESSION:
session_start(); // tohle musí být před jakýmkoli výstupem...
$pole = array("rohlik","houska","něco");
if(!isset($_SESSION["zobraz"])) {
$_SESSION["zobraz"]==0;
}
echo $pole[$_SESSION["zobraz"]];
$_SESSION["zobraz"]++;
if($_SESSION["zobraz"]>=count($pole)) {
$_SESSION["zobraz"] = 0;
}

Tohle vždy při načtení stránky zobrazí další prvek z pole, když se pole vyčerpá, skočí na začátek...
rernst
Profil *
Problém je, že napoprvé to nic nenačte, až po aktualizaci viz: http://spustit.cz/test.php
a také pokud to dam takto do přehrávače, tak to taky nejd viz: http://spustit.cz/articles.php?article_id=106
LosFilipos
Profil
Omlouvám se, mám tam překlep. Ta podmínka s if má vypadat takto:
if(!isset($_SESSION["zobraz"])) {
$_SESSION["zobraz"]=0;
}

Nějak se mi tam vloudilo druhé rovnáse:-/ Takhle to bude fungovat od prvního načtení stránky.
RErnst
Profil *
ok, moc dík, hned jak to půjde tak to zkusím, teď jsem na mobilu..
Rernst
Profil *
Zjistil jsem takový problém a to ten, že to generování není uplně náhodné, ale docela dost pravidelné, když použiji toto:
session_start(); // tohle musí být před jakýmkoli výstupem...
$pole = array("rohlik","houska","něco");
if(!isset($_SESSION["zobraz"])) {
$_SESSION["zobraz"]==0;
}
echo $pole[$_SESSION["zobraz"]];
$_SESSION["zobraz"]++;
if($_SESSION["zobraz"]>=count($pole)) {
$_SESSION["zobraz"] = 0;
}


Tak se vždycky vygeneruje jedna věc, restartuji prohlížeč (vypnu a zapnu) a poté se vygeneruje ta samá věc, nevíš jak tomu zabránit?

..snad mě chápeš
LosFilipos
Profil
Rernst:
Zjistil jsem takový problém a to ten, že to generování není uplně náhodné, ale docela dost pravidelné
Ano, protože tam se to pole prochází postupně od začátku do konce, aby se zabránilo opakování výsledků.

Tak se vždycky vygeneruje jedna věc, restartuji prohlížeč (vypnu a zapnu) a poté se vygeneruje ta samá věc, nevíš jak tomu zabránit?
if(!isset($_SESSION["zobraz"])) {
$_SESSION["zobraz"]=rand(0,count($pole)-1);
}
// zbytek kódu beze změny
Takto při restartu prohlížeče vybere náhodný prvek z pole a poté pokračuje v procházení pole položku po položce...

Ještě k tomu náhodnému generování. Musíš se rozhodnout, zda je pro tebe priorita náhodný výběr prvků z pole, nebo aby se daný prvek neoběvil 2x za sebou. Jistě, šlo by napsat funkci, která by náhodně vybírala z pole a poté kontrolovala, zda se stejný prvek nezobrazil už předtím, ale bylo by to daleko komplikovanější a muselo by se použít nějaké zběsilé rekurzivní funkce, což je dolela náročné na systémové zdroje...
LosFilipos
Profil
Rernst:
Tak takhle by mohla vypadat ta funkce na zcela náhodné vybírání prvků z pole s ochranou proti opakování záznamů:
session_start();
$pole = array("rohlik","houska","něco");

function rand_z_pole($pole,$old_key) {
$key = array_rand($pole);
if($key == $old_key) {
return rand_z_pole($pole,$old_key);
} else {
$_SESSION["key"] = $key;
return $pole[$key];
}
}
echo rand_z_pole($pole,$_SESSION["key"]);
Rernst
Profil *
LosFilipos: Ok, dík, takhle to funguje :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: