2012-03-13 12 views
0

私は問題があります。私の機能を読んでいくうちに明らかになるでしょうが、何をすべきか分かりません。シンプル?私の機能を持つ論理的欠陥

問題は「do」を使用する必要があるということです。「do」の結果が必要なため、「while」でテストする必要があります。問題は、whileがfalseを返す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; 
    } 
} 

ありがとうございました。

答えて

2

これらの文字を区別できるフォントでこのコードを表示する方が簡単ではないでしょうか?それは言われて、単にあなたの複数の文字列の一致を「簡素化」するために正規表現を使用します。使用方法から、それらの文字を排除

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

はちょうどそれがはるかに可能性が高いあなたは、重複バウチャーになってしまいますことができます。

+0

こんにちは、Marc。これらのコードは、スクラッチが付いたプラスチックカードに印刷され、スーパーマーケットで販売される予定です。フォントはあまりカスタマイズできず、私のアリーナではありません。 –

+0

preg_matchはロジックの問題を修正して動作しますが、大文字と小文字を区別しなくても大文字I文字を表示しています。 :S –

+0

これは '/ i'の後ろにあるものです。マッチで大文字小文字を区別しません。 –

関連する問題