Для сайта электронной коммерции я хочу создать случайный код купона, который выглядит лучше, чем случайно сгенерированное значение. Это должен быть читаемый код купона, все в верхнем регистре без специальных символов, только буквы (AZ) и цифры (0-9).
Так как люди могут читать это или распечатывать в другом месте, мы должны сделать это значение для простого общения, возможно, длиной 8-10 символов.
Что-то вроде, возможно,
AHS3DJ6BW
B83JS1HSK
(я набрал это, так что ' не так уж и случайно)
$chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$res = "";
for ($i = 0; $i < 10; $i++) {
$res .= $chars[mt_rand(0, strlen($chars)-1)];
}
Вы можете оптимизировать это, предварительно выделив строку $ res
и кэшируя результат strlen ($ chars) -1
. Это оставлено читателю в качестве упражнения, поскольку, вероятно, вы не будете генерировать тысячи купонов в секунду.
вы можете найти много функций в руководстве по php rand
http://php.net/manual/en/function.rand.php
мне нравится этот
<?php
//To Pull 8 Unique Random Values Out Of AlphaNumeric
//removed number 0, capital o, number 1 and small L
//Total: keys = 32, elements = 33
$characters = array(
"A","B","C","D","E","F","G","H","J","K","L","M",
"N","P","Q","R","S","T","U","V","W","X","Y","Z",
"1","2","3","4","5","6","7","8","9");
//make an "empty container" or array for our keys
$keys = array();
//first count of $keys is empty so "1", remaining count is 1-7 = total 8 times
while(count($keys) < 8) {
//"0" because we use this to FIND ARRAY KEYS which has a 0 value
//"-1" because were only concerned of number of keys which is 32 not 33
//count($characters) = 33
$x = mt_rand(0, count($characters)-1);
if(!in_array($x, $keys)) {
$keys[] = $x;
}
}
foreach($keys as $key){
$random_chars .= $characters[$key];
}
echo $random_chars;
?>
Попробуйте следующее:
substr(base_convert(sha1(uniqid(mt_rand())), 16, 36), 0, 10)
Почему бы не сделать это проще?
<?php
echo strtoupper(uniqid());
?>
Всегда возвращает 13-символьный случайный код в верхнем регистре.
http://webarto.com/35/php-random-string-generator
Вот.
function randr($j = 8){
$string = "";
for($i=0;$i < $j;$i++){
srand((double)microtime()*1234567);
$x = mt_rand(0,2);
switch($x){
case 0:$string.= chr(mt_rand(97,122));break;
case 1:$string.= chr(mt_rand(65,90));break;
case 2:$string.= chr(mt_rand(48,57));break;
}
}
return strtoupper($string); //to uppercase
}
function generateCouponCode($length = 8) {
$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$ret = '';
for($i = 0; $i < $length; ++$i) {
$random = str_shuffle($chars);
$ret .= $random[0];
}
return $ret;
}
Если нет требований к безопасности, то вам не нужны случайно генерируемые коды. Я бы просто использовал инкрементные идентификаторы, например, генерируемые любой используемой вами СУБД. Как вариант, если у вас есть разные типы купонов, вы можете префикснуть коды чем-нибудь, например:
CX00019 QZ0001C
CX0001A QZ0001D
CX0001B QZ0001E
Как вариант, вы можете даже использовать словарные слова в купоне, так как такие коды купонов легче запоминаются и быстрее набираются пользователями. Такие компании, как Dreamhost, используют их для своих промо-кодов, например:
Promo60
NoSetupFee
YELLOWGORILLA82
Некоторые из них, очевидно, создаются человеком (что вы, возможно, захотите сделать), но они также могут быть сгенерированы с помощью словарного списка. Но даже если это случайно сгенерированные бессмысленные фразы, тот факт, что символы следуют логической схеме, все равно делает их гораздо более удобными для пользователя, чем что-то вроде R7QZ8A92F1
. Поэтому я бы настоятельно рекомендовал не использовать последний тип кодов купонов только на том основании, что они "круто выглядят". Ваши клиенты скажут вам спасибо.
$length = 9;
$code = (strtoupper(substr(md5(time()), 0, $length)));