我正在使用Laravel 5.1框架。生成並保存百萬個唯一代碼
我需要從字符'BCDFGHIJKLMNPQRSTVWXYZ'取5,例如DFGHJ創建一組唯一代碼。
所以,我的代碼是這樣的:
$maxCodes = 1200000;
$codeSize = 5;
$characters = 'BCDFGHJKLMNPQRSTVWXY';
$cLenght = strlen($characters);
$sizeBlock = $maxCodes/($cLenght*4); // For not overflow memory when put the codes in array
for ($i=0; $i < $cLenght; $i++) {
$subCharacters = str_replace($characters[$i], '', $characters);
$existCodes = [];
for ($k = 0; $k < 4; $k++) {
$codesToInsert = [];
for ($j = 0; $j < $sizeBlock;) {
$code = $characters[$i] . substr(str_shuffle($characters), 0, $codeSize-1);
if (!isset($existCodes[$code])) {
$existCodes[$code] = '';
array_push($codesToInsert, ['code' => $code, 'used' => 0, 'rand' => rand(0,10)]);
$j++;
}
}
\App\Code::insert($codesToInsert);
}
}
我會解釋一下我的代碼。因爲我的代碼是按字母順序排列的,所以我把一個隨機數的字段rand(我創建這個字段用於下一個查詢,如Code :: where('used',0) - > where('rand',rand(0 ,9)),通過這種方式我檢索了一個隨機代碼,而不是按字母順序)
問題是當我運行函數來生成代碼,其創建只有135000不是$ maxCodes,但我不知道爲什麼? ..
有人可以幫助我嗎?
謝謝!
PS.-對不起給我English ..
沒有坐下來,做了很多數學的,我懷疑你不是生成的隨機碼 - 你已經生成*按字母順序排列的每組* 5個字母組合。 – symcbean
不需要,用戶可以設置maxCode。所有的可能性都是1.8Million我已經設置了1.2Million的示例代碼1.2Million – Krlinhos
我懷疑爲這個長度爲5的需求生成代碼的最好方法是生成所有組合並對其進行混洗。原因是需要大量的組合並生成隨機的組合並檢查是否唯一會產生很多衝突。請參閱:[PHP算法來生成從一個集合的特定大小的所有組合](http://stackoverflow.com/questions/19067556/php-algorithm-to-generate-all-combinations-of-a-specific-size -from-A-單集)。 –