Autor | Zpráva | ||
---|---|---|---|
Tori Profil |
A teď, když vám to funguje jak chcete, byste mohl pro změnu zkusit trochu vylepšit ten kód. :-) Pro začátek třeba odstranit ty chyby (warning, notice), které vyhazuje a přeformátovat kód tak, aby byl čitelný i pro někoho jiného než jen pro vás. Fakt je nutných tolik stejných podmínek na začátku (= nestačilo by třeba 3D pole, kde typ kódu je klíč a pole [znaky + název + čislo] je hodnota)? Pokud je možnost, že se funkce bude volat za běhu aplikace opakovaně, nedalo by se použít statické proměnné a ušetřit nějaký výpočet? Místo doplňování stejného znaku cyklem (ř. 45) se dá použít i str_repeat.
|
||
Silver8000 Profil |
#2 · Zasláno: 13. 11. 2014, 09:58:52
No jelikoz nevim jak mam funkci zjednodusit tak jsem tam pridal alespon popisky co je co.
<?php function unique_key_generator($default_code_length=1,$default_code_type=1,$default_code=false,$code_random=true){ //Sub funkce code_count(); zajistuje vypocet pozice klice jestly je 1. nebo 80. atp. function code_count($code_base,$array_chars) { $characters = array_flip($array_chars); $character_keys = $array_chars; $code_characters = str_split($code_base); $number = 0; for ($i = 0; $i < count($code_characters); $i++) { $number = $number * count($characters) + $character_keys[$code_characters[$i]]; } return $number; # pokud chceš tak ještě +1 } //Casovy otisk -> Time stamp $code_time = time(); //Informace o tom kolik druhu klicu muze funkce poskytnout $code_max_type = 5; //Druhy klicu if ($default_code_type==1){ //Sestaveni array tabulky s jednotlivimy znaky $characters = array_merge(range('A','Z'), range('a','z')); //Jmeno generovaneho klice $code_name = '[A-Z,a-z]'; //Cislo generovaneho klice $code_number = 1; } if ($default_code_type==2){ //Megaupload.com style //Sestaveni array tabulky s jednotlivimy znaky $characters = array_merge(range('A','Z'), range('0','9')); //Jmeno generovaneho klice $code_name = '[A-Z,0-9]'; //Cislo generovaneho klice $code_number = 2; } if ($default_code_type==3){ //Sestaveni array tabulky s jednotlivimy znaky $characters = array_merge(range('a','z'), range('0','9')); //Jmeno generovaneho klice $code_name = '[a-z,0-9]'; //Cislo generovaneho klice $code_number = 3; } if ($default_code_type==4){ //Sestaveni array tabulky s jednotlivimy znaky $characters = array_merge(range('A','Z'), range('a','z'), range('0','9')); //Jmeno generovaneho klice $code_name = '[A-Z,a-z,0-9]'; //Cislo generovaneho klice $code_number = 4; } if ($default_code_type>4){ //Youtube.com style //Sestaveni array tabulky s jednotlivimy znaky $characters = array_merge(range('A','Z'), range('a','z'), range('0','9'),array('-','_')); //Jmeno generovaneho klice $code_name = '[A-Z,a-z,0-9,-_]'; //Cislo generovaneho klice $code_number = 5; } //Vypocet kolik klicu muze generator poskytnout $count_characters = count($characters); $count_range = pow($count_characters, $default_code_length); //Oznaceni konce ve vypoctu klicu $character_end = 'Z'; $character_start = ''; $array_chars = array_flip($characters); //Podminka slouzi pro detekci jestly ma funkce vygenerovat pocatecni ,nahodny nebo nasledujici klic if ($default_code==false){ //Generator nahodneho nebo pocatecniho klice for ($n=1;$default_code_length>=$n;$n++){ if ($code_random){ //Generace nahodneho klice $character_start .= $characters[rand(0,($count_characters-1))]; }else{ //Generace pocatecniho klice $character_start .= 'A'; } } $code_base = $character_start; return array('code_base'=>$code_base,'code_base_md5'=>md5($code_base),'code_base_sha1'=>sha1($code_base),'code_base64_encode'=>base64_encode($code_base),'code_time'=>$code_time,'code_count'=>code_count($code_base,$array_chars),'code_range'=>$count_range,'code_message'=>'','code_name'=>$code_name,'code_type'=>$code_number,'code_max_type'=>$code_max_type,'code_length'=>$default_code_length); }else{ //Generace nasledujiciho klice $chars = $characters; $code_array = str_split($default_code); // Starts searching for the next character capable of increasing, or different from Z // Note that initiates the last character to the first for($i = count($code_array)-1;$i>-1;$i--){ if($code_array[$i] == $character_end){ if($i=='0'){ //If equal to Z and is the first character, mental increases the length and zeroes $code_array = array_fill(0,count($code_array) + 1,0); $code_base = implode("",$code_array); //Podminka hlida generaci spravneho klice, pokud je klic spravne dostanete -> 'code_message'=>'' jinak je vygenerovany klic spatne nebo uz funkce vygenerovala maximalni pocet klicu if ($default_code_length==strlen($code_base)){ return array('code_base'=>$code_base,'code_base_md5'=>md5($code_base),'code_base_sha1'=>sha1($code_base),'code_base64_encode'=>base64_encode($code_base),'code_range'=>$count_range,'code_count'=>code_count($code_base,$array_chars),'code_time'=>$code_time,'code_message'=>'','code_name'=>$code_name,'code_type'=>$code_number,'code_max_type'=>$code_max_type,'code_length'=>$default_code_length); }elseif($default_code_length<strlen($code_base)){ return array('code_base'=>$code_base,'code_base_md5'=>md5($code_base),'code_base_sha1'=>sha1($code_base),'code_base64_encode'=>base64_encode($code_base),'code_range'=>$count_range,'code_count'=>code_count($code_base,$array_chars),'code_time'=>$code_time,'code_message'=>'is_upper_or_full','code_name'=>$code_name,'code_type'=>$code_number,'code_max_type'=>$code_max_type,'code_length'=>$default_code_length); }else{ return array('code_base'=>$code_base,'code_base_md5'=>md5($code_base),'code_base_sha1'=>sha1($code_base),'code_base64_encode'=>base64_encode($code_base),'code_range'=>$count_range,'code_count'=>code_count($code_base,$array_chars),'code_time'=>$code_time,'code_message'=>'is_lower','code_name'=>$code_name,'code_type'=>$code_number,'code_max_type'=>$code_max_type,'code_length'=>$default_code_length); } }else{ if($code_array[$i -1] != $character_end){ // If the character is different from previous Z, increment it and resets the current and subsequent // If the character is above the first, also works because it increases and the other resets $code_array[$i -1] = $chars[array_search($code_array[$i -1],$chars) + 1]; for($j = $i; $j < count($code_array); $j++){ $code_array[$j] = '0'; } $code_base = implode("",$code_array); //Podminka hlida generaci spravneho klice, pokud je klic spravne dostanete -> 'code_message'=>'' jinak je vygenerovany klic spatne nebo uz funkce vygenerovala maximalni pocet klicu if ($default_code_length==strlen($code_base)){ return array('code_base'=>$code_base,'code_base_md5'=>md5($code_base),'code_base_sha1'=>sha1($code_base),'code_base64_encode'=>base64_encode($code_base),'code_range'=>$count_range,'code_count'=>code_count($code_base,$array_chars),'code_time'=>$code_time,'code_message'=>'','code_name'=>$code_name,'code_type'=>$code_number,'code_max_type'=>$code_max_type,'code_length'=>$default_code_length); }elseif($default_code_length<strlen($code_base)){ return array('code_base'=>$code_base,'code_base_md5'=>md5($code_base),'code_base_sha1'=>sha1($code_base),'code_base64_encode'=>base64_encode($code_base),'code_range'=>$count_range,'code_count'=>code_count($code_base,$array_chars),'code_time'=>$code_time,'code_message'=>'is_upper_or_full','code_name'=>$code_name,'code_type'=>$code_number,'code_max_type'=>$code_max_type,'code_length'=>$default_code_length); }else{ return array('code_base'=>$code_base,'code_base_md5'=>md5($code_base),'code_base_sha1'=>sha1($code_base),'code_base64_encode'=>base64_encode($code_base),'code_range'=>$count_range,'code_count'=>code_count($code_base,$array_chars),'code_time'=>$code_time,'code_message'=>'is_lower','code_name'=>$code_name,'code_type'=>$code_number,'code_max_type'=>$code_max_type,'code_length'=>$default_code_length); } } } }else{ // calculate the next character, or increments the current $code_array[$i] = $chars[array_search($code_array[$i],$chars) + 1]; if($i == '0'){ // If the first character, meaning others Salo z // That is, they reset $novo_array = array_fill(0,count($code_array),0); $novo_array[0] = $code_array[$i]; $code_array = $novo_array; } $code_base = implode("",$code_array); //Podminka hlida generaci spravneho klice, pokud je klic spravne dostanete -> 'code_message'=>'' jinak je vygenerovany klic spatne nebo uz funkce vygenerovala maximalni pocet klicu if ($default_code_length==strlen($code_base)){ return array('code_base'=>$code_base,'code_base_md5'=>md5($code_base),'code_base_sha1'=>sha1($code_base),'code_base64_encode'=>base64_encode($code_base),'code_range'=>$count_range,'code_count'=>code_count($code_base,$array_chars),'code_time'=>$code_time,'code_message'=>'','code_name'=>$code_name,'code_type'=>$code_number,'code_max_type'=>$code_max_type,'code_length'=>$default_code_length); }elseif($default_code_length<strlen($code_base)){ return array('code_base'=>$code_base,'code_base_md5'=>md5($code_base),'code_base_sha1'=>sha1($code_base),'code_base64_encode'=>base64_encode($code_base),'code_range'=>$count_range,'code_count'=>code_count($code_base,$array_chars),'code_time'=>$code_time,'code_message'=>'is_upper_or_full','code_name'=>$code_name,'code_type'=>$code_number,'code_max_type'=>$code_max_type,'code_length'=>$default_code_length); }else{ return array('code_base'=>$code_base,'code_base_md5'=>md5($code_base),'code_base_sha1'=>sha1($code_base),'code_base64_encode'=>base64_encode($code_base),'code_range'=>$count_range,'code_count'=>code_count($code_base,$array_chars),'code_time'=>$code_time,'code_message'=>'is_lower','code_name'=>$code_name,'code_type'=>$code_number,'code_max_type'=>$code_max_type,'code_length'=>$default_code_length); } } } } } ?> Tori: „Pro začátek třeba odstranit ty chyby (warning, notice)“ Ja kdyz necham funkci vygenerovat klic tak se mi tam nic neukazuje a to jsem zkousel vsechny moznosti nastaveni. |
||
juriad Profil |
#3 · Zasláno: 13. 11. 2014, 10:32:34
Silver8000:
„Funkce obsahuje tzv. "All in one" ,coz jak je zrejme ze generuje bud nahodny,pocatecni a nebo nasledujici klic proto je tam tolik podminek.Zalezi hlavne na nastaveni ktere si zvolite.“ A to je chyba. Přece generování každé z těch možností může řešit jiná funkce. Každá z nich bude docela krátká a to co by měly společného bude řešit jiná funkce, kterou každá z nich bude volat. generate_random_key() generate_next_key() generate_default_key() Další možnosti zjednodušení: Zařiď, aby existoval ve funkci jen jediný return. Dále zruš parametr $default_code_type a nahraď ho za pole znaků, které poskytne uživatel. A vytvoř funkci default_code_chars($type), která vrací to pole. Tak ta funkce bude umět libovolnou „abecedu“. Ty moji funkci vyhoď ven; proč máš funkci uvnitř funkce? A rázem ta funkce bude poloviční. Související úlohy: Zkus si třeba napsat funkci, která negeneruje následující, ale předchozí kód. Samozřejmě, že bys mohl přidat další parametr následujici , který by byl true/false, ale jistě to jde lépe.
Nebo víš co? Můžeš si napsat vlastní aritmetický modul. Funkce dostane jako vstup dvě čísla zadané jako řetězce a máš je sečíst a vrátit součet zase jako řetézec. A chceš aby to umělo pracovat s čísly, která mají desítky/stovky cifer. |
||
Časová prodleva: 2 roky
|
|||
Silver8000 Profil |
#4 · Zasláno: 18. 3. 2017, 02:40:36
Po dlouhe casove prodleve jsem udelal posledni aktualizaci.
Kod jsem celkove predelal na tridu(class) a zjednodusil aby byl prehledny,opravil jsem vsechny vadne casti a ted je plne funkcni. Komplexni generator klicu |
||
Časová prodleva: 6 let
|
0