Autor Zpráva
Začátečník
Profil *
Ahoj, tady jsem našel funkci na generování hesel, ne že bych ji potřeboval ale zaujal mě v kódu jeden řádek

Kód
function generpassword($length=45,$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'){
 $numChars = strlen($chars);
 $r = '';
 for ($i = 0; $i < $length; $i++) {
 $r .= substr($chars, mt_rand(1, $numChars) - 1, 1);
 }
 return $r;
 }


na tomto řádku mi není jasne, proč programátor odečítá hodnotu 1 ve funkci mt_rand, napadá někoho něco?
 $r .= substr($chars, mt_rand(1, $numChars) - 1, 1);


Zdroj zde: http://www.accessdenied.cz/php/generovani-hesel-v-php
Bertram
Profil
Ahoj, představ si situaci kdy mt_rand() vygeneruje horní mez počtu znaků $chars.
Potom by jsi po funkci substr() chtěl ať ti vrátí jeden znak za posledním znakem, nacož by vrátila false.
První znak je ošetřen generováním funkce md_rand() od jedničky kdy po odečtení jedničky funkci substr() jako první argument předáš nulu a ta vrací první znak.
TomasJ
Profil
Protože když použiješ strlen() nějakého řetězce, získáš počet znaků. Když chceš z řetězce nějaký znak, počítá 1. znak jako 0... To znamená, že $chars[0] == "a" a $chars[$strlen($chars)] už se nerovná žádnému znaku. Když odečteš 1 z toho $numChars, pak se $chars[$numChars] == "0" :)

$retezec = "abcd"; //4 znaky - a=0,b=1,c=2,d=3
$len = strlen($retezec); //vyjde 4
echo $retezec[0]; //0 = 1. pozice - znak "a"
echo $retezec[$len]; //nevypíše žádný znak, protože na 4. pozici už žádný není.
echo $retezec[$len-1]; //vypíše znak "d"


Snad jsem to vysvětlil srozumitelně ;)

EDIT: Jak říká Bertram - já to jen nenapsal tak odborně :)

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:

0