0

私はこのPHPコードを持っています:

$char = array_merge(range('a', 'z'), range('A', 'Z'), range(0, 9));

$i = 0;
while ($i <= 5) {
    $var .= $char[rand(0,68)];
    $i++;
}

echo $var;

一見すると、6文字の刺し傷が生成されるはずです(eVx97jのように)。

私はほとんどの場合そうしますが、場合によっては5文字と4文字の文字列をエコーし​​ます。

私はそれがこれのためであるとほぼ確信しています:

問題とは何の関係もありません)

  [50]=>
  string(1) "Y"
  [51]=>
  string(1) "Z"
  [52]=>
  int(0)
  [53]=>
  int(1)
  [54]=>
  int(2)

違いを見ます?

私を困惑させるのは、コード数字を含む文字列を生成することです。

では、バグを見つけることができますか?

これは、PHPでaz + AZ + 0〜9文字を表現する正しい方法ですか?

前もって感謝します!!

必要な説明を求めてください!


ところで:私も試しました:$char = array_merge(range('a', 'z'), range('A', 'Z'), range('0',' 9'));

4

3 に答える 3

2
rand(0,68)

その配列の62個の要素のみをカウントします。

A-Z (26)
a-z (26)
0-9 (10)
    ----
     62

多分私の数学はオフですか?(あなたのイデオネでさえインデックス0-61を示しています; -p)

私の推測では、配列の境界外のインデックスを取得していて、それらを追加することはありません(追加する必要もありません)。また、エラー抑制がオンになっている可能性があるため、気付かれることはありません。

于 2011-01-30T05:54:05.510 に答える
2

私の推奨事項は次のとおりです。

$chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$pool = str_split($chars, 1);
$max = count($pool) - 1;

$random = '';
for ($i = 1; $i <= 5; $i ++) {
    $random .= $pool[mt_rand(0, $max)];
}

echo $random;

許可される文字が何であるかを確認するのがはるかに簡単になり、また、一連のrange()とマージを必要としません。

これは実際にはコハナコアからかなりまっすぐです:https ://github.com/kohana/core/blob/3.0/develop/classes/kohana/text.php#L140彼らは異なることを可能にするキャラクターのさまざまなグループを提供しますパスワード生成に非常に役立つdistinctを含むランダムセット。

于 2011-01-30T05:56:23.593 に答える
2

問題は、rand(0,68)アルファベットが68文字ではなく62文字であるためです。したがって、rand整数63〜67を返すと、空の文字列がに追加され$var、5文字の短い文字列になります(「運が悪い」場合はさらに少なくなります)。 )。

とにかく、私はあなたが単に使用する方がより明確だと思いますarray_rand

$char = array_merge(range('a', 'z'), range('A', 'Z'), range(0, 9));
for ($i = 0; $i < 6; $i++) {
    $var .= $char[array_rand($char)];
}
echo $var;
于 2011-01-30T06:11:32.403 に答える