随机字符串避免数组中的单词行为不正确

时间:2011-09-23 06:21:09

标签: php arrays random

我在我的代码中发现了一些意想不到的行为,因此提供了两个示例来演示正在发生的事情,并且无法从中找出问题。我发现对我来说很奇怪,也许我错过了一些东西。

目标:创建随机字符串并避免在数组中指定任何内容。

在下面的示例中,我有两种测试方法。

首先,我有一个函数,从指定的字符($字符)创建一个随机字符串然后我有一个数组($ avoid)(这里指定了双字母)然后循环并通知你代码是否有效,它确实找到了数组中指定的内容。

这似乎有效,但是如果发生相同的触发器,我修改了第二个函数以尝试生成新的随机字符串。这样可以避免在数组中包含任何字符串。

这部分似乎不起作用..我不确定如何从这里修改它,但我必须遗漏一些东西。运行代码是有效的,但它会抓住一些东西并且错过其他时间......我不希望代码。

function getrandom($loopcount)
{
    $loopcount++;

    $length     = 20;
    $characters = 'abc';
    $string     = '';

    for ($p = 0; $p < $length; $p++)
        $string.= $characters[ mt_rand( 0,strlen($characters) ) ];

    $avoid = array(
                   'aa',
                   'bb',
                   'cc'
                   );

    foreach ($avoid as $word)
        if ( stripos($string,$word) )
            $string = 'Double '.$word.' Detected:'.$string;

    return '<h1 style="color:blue;">'.$string.'<h1>';
}
echo getrandom(0);
echo getrandom(0);
echo getrandom(0);



function getrandom2($loopcount)
{
    $loopcount++;

    $length     = 20;
    $characters = 'abc';
    $string     = '';

    for ($p = 0; $p < $length; $p++)
        $string.= $characters[ mt_rand( 0,strlen($characters) ) ];

    $avoid = array(
                   'aa',
                   'bb',
                   'cc'
                   );

    foreach ($avoid as $word)
        if ( stripos($string,$word) )
            $string = getrandom2($loopcount);

    return '<h1 style="color:green;">'.$string.'<h1>';
}
echo getrandom2(0);
echo getrandom2(0);
echo getrandom2(0);

3 个答案:

答案 0 :(得分:1)

我用过这个

function randomToken($length) 
{
    srand(date("s"));
    $possible_charactors = "abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $string = "";
    while(strlen($string)<$length) 
    {
        $string .= substr($possible_charactors, rand()%strlen($possible_charactors),1);
    }
    return($string);
}

答案 1 :(得分:0)

您需要使用tripple运算符检查stripos(),否则您的if会将位置0处的匹配项解释为false(1)

foreach ($avoid as $word){
    if ( stripos($string,$word) !== FALSE){
        $string = getrandom2($loopcount);
    }
}

(1)http://php.net/manual/en/language.operators.comparison.php

答案 2 :(得分:0)

以下对我有用:

print gen_rand_str_avoid('abc', 20, array('aa', 'bb', 'cc'));

function gen_rand_str($chars, $length) {
  $str = '';
  for ($i = 0; $i < $length; $i++) {
    $str .= $chars[mt_rand(0, strlen($chars) - 1)];
  }
  return $str;
}

function gen_rand_str_avoid($chars, $length, array $avoids) {
  while (true) {
    $str = gen_rand_str($chars, $length);
    foreach ($avoids as $avoid) {
      if (stripos($str, $avoid) !== false) {
        continue 2;
      }
    }
    break;
  }
  return $str;
}