PHP ver gevorderde |
|
Hey,
Ik gebruik de volgende functie om unieke loten te genereren:
<?php
function generateLotcode() {
$range['alpha'] = range('a', 'f');
$range['num'] = range(0, 9);
$loot = '';
for($x = 1; $x <= 6; $x++) {
if($x == 1) {
$loot .= $range['alpha'][rand(0, 5)];
} else {
$loot .= $range['num'][rand(0, 9)];
}
}
$loot = strtoupper($loot);
$loot = 'X'.rand(0, 5); // testing purposes - zodat er snel een dubbel optreed want X1 en X2 staan in de database
$res = mysql_query("SELECT lotcode FROM loten WHERE lotcode = '".mysql_real_escape_string($loot)."' LIMIT 1");
if(!mysql_num_rows($res)) {
print 'Ok: '.$loot.' <br />'; // testing purposes
return $loot;
} else {
print 'Dubbel: '.$loot.' <br />'; // testing purposes
generateLotcode();
}
}
$loten = array();
for($i = 1; $i <= $aantal_loten; $i++) {
$loten[] = generateLotcode();
}
print '<pre>';
print_r($loten);
print '</pre>';
?>
<?php function generateLotcode() { $range['alpha'] = range('a', 'f'); $range['num'] = range(0, 9); $loot = ''; for($x = 1; $x <= 6; $x++) { if($x == 1) { $loot .= $range['alpha'][rand(0, 5)]; } else { $loot .= $range['num'][rand(0, 9)]; } } $loot = 'X'.rand(0, 5); // testing purposes - zodat er snel een dubbel optreed want X1 en X2 staan in de database print 'Ok: '.$loot.' <br />'; // testing purposes return $loot; } else { print 'Dubbel: '.$loot.' <br />'; // testing purposes generateLotcode(); } } for($i = 1; $i <= $aantal_loten; $i++) { $loten[] = generateLotcode(); } ?>
Maar nu is de output bijvoorbeeld als volgt bij 6 loten:
Dubbel: X2
Ok: X0
Ok: X3
Ok: X4
Ok: X0
Dubbel: X2
Ok: X4
Ok: X3
Array
(
[0] =>
[1] => X3
[2] => X4
[3] => X0
[4] =>
[5] => X3
)
Zoals je ziet laat hij lege plekken achter waar dubbels optreden, terwijl hij net zo lang een nieuwe code moet zoeken die nog niet in gebruik is.
In praktijk zijn er 600.000 mogelijkheden dus zal een dubbel niet snel optreden, maar ik vind het toch noodzakelijk de kans in acht te nemen.
Heeft iemand enig idee waar de fout zit?
Gr Jarno
EDIT: Return vergeten..
|