Просто?Недостаток логики с моей функцией - PullRequest
0 голосов
/ 13 марта 2012

У меня проблема, она, вероятно, станет очевидной, когда вы прочитаете мою функцию, но я не могу понять, что делать.

Проблема в том, что мне нужно использовать «делать, пока»потому что мне нужен результат "do", чтобы проверить в "while".Проблема в том, что когда while получает все 4 условия, возвращающие ложное, оно завершается, но это оставляет меня с неверным кодом.

Мне нужно перегенерировать код, пока он не будет содержать неразличимых символов.

function make_code(){
    do{
        $prefix         = mt_rand(0, mt_getrandmax());
        $code           = uniqid($prefix);//good to make sure we always have a unique string to work with, even with no seed supplied.
        $sha1           = sha1($code);
        $base_convert   = base_convert($sha1, 16, 36);//expand hex with the rest of the alphabet.
        $substr         = substr($base_convert, 0, 12);//we only want the first 12 characters.
        $strtoupper     = strtoupper($substr);//for aesthetics.
        $str_split      = str_split($strtoupper, 4);//seperate into chunks.
        $voucher_code   = $str_split[0] . self::CS . $str_split[1] . self::CS . $str_split[2];//build
    }
    while(
            (stristr($voucher_code, "o") === false)
         && (stristr($voucher_code, "0") === false)
         && (stristr($voucher_code, "1") === false)
         && (stristr($voucher_code, "i") === false));


    return $voucher_code;
  }
}

Спасибо за любую помощь.

1 Ответ

2 голосов
/ 13 марта 2012

Не проще ли представить этот код шрифтом, который делает эти символы различимыми?При этом просто используйте регулярное выражение, чтобы «упростить» совпадения нескольких строк:

do {
   ...
while (preg_match('/[01lo]/i', $voucher_code));

Исключение этих символов из использования только повышает вероятность получения дубликата ваучера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...