Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中生成字母数字字符串_Php_String - Fatal编程技术网

在PHP中生成字母数字字符串

在PHP中生成字母数字字符串,php,string,Php,String,我有一个PHP函数,可以生成给定长度的字母数字字符串。该函数工作正常。但生成的字符串有时包含数字,有时不包含数字。我希望字符串每次都必须由数字和alpha组成。我需要一些建议。以下是函数的代码: public static function GenerateAlphaNumString($length=0) { $characterPool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

我有一个PHP函数,可以生成给定长度的字母数字字符串。该函数工作正常。但生成的字符串有时包含数字,有时不包含数字。我希望字符串每次都必须由数字和alpha组成。我需要一些建议。以下是函数的代码:

public static function GenerateAlphaNumString($length=0) {
        $characterPool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $randomString = '';

        for ($i = 0; $i < $length; $i++) {
            $randomString .= $characterPool[rand(0, strlen($characterPool) - 1)];
        }

        return $randomString;
    } 
公共静态函数GenerateAlphaNumString($length=0){
$characterPool='0123456789abcdefghijklmnopqrstuvxyzabefghijklmnopqrstuvxyz';
$randomString='';
对于($i=0;$i<$length;$i++){
$randomString.=$characterPool[rand(0,strlen($characterPool)-1)];
}
返回$randomString;
} 

这应该可以做到

$characterPool = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$randomString = '';
$numberscount = rand(1,$length-1);
for ($i = 0; $i < $numberscount; $i++) {
    $randomString .= rand(0,9);
}
for ($i = 0; $i < ($length - $numberscount); $i++) {
    $randomString .= $characterPool[rand(0, strlen($characterPool) - 1)];
}
$characterPool='abcdefghijklmnopqrstuvxyzabefghijklmnopqrstuvxyz';
$randomString='';
$numberscont=rand(1,$length-1);
对于($i=0;$i<$numberscont;$i++){
$randomString.=rand(0,9);
}
对于($i=0;$i<($length-$numberscont);$i++){
$randomString.=$characterPool[rand(0,strlen($characterPool)-1)];
}

当$length=1时,它总是打印一个字符。

在返回字符串之前添加以下内容

If(!preg_match( '/([0-9]+)/', $randomString) {
     return self::GenerateAlphaNumString($length);
}

如果字符串中没有数字,只需调用相同的函数,直到有数字为止

您可以这样做:

// Add a quick exit:
if ($length <= 0) return '';

// Produce all characters except the last one: 
for ($i = 0; $i < $length-1; $i++) {
    $randomString .= $characterPool[rand(0, strlen($characterPool) - 1)];
}

// Check if string contains a digit, if not, reduce range 
// for generating last character so it can only be a digit:
$lastRange = preg_match("/\d/", $randomString) ? strlen($characterPool) : 10;
// choose random position, and insert last character in there:
$randomString = substr_replace($randomString, $characterPool[rand(0, $lastRange-1)], 
                               rand(0, $length-1), 0);

return $randomString;
//添加一个快速退出:

如果($length是一个完整的示例,提供灵活性:

<?php

class StringGenerator
{
  private $characterPool = [
    'numeric' => '0123456789',
    'alpha' => 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
  ];

  function generateRandomString($length, $pool) {
    $randomString = '';
    for ($i = 0; $i  < $length; $i++) {
      $randomString .= $this->characterPool[$pool][rand(0, strlen($this->characterPool[$pool]) - 1)];
    }
    return $randomString;
  }

  function generateAlphaNumString($length=0, $numeric=0) {
    return str_shuffle(
      $this->generateRandomString($numeric, 'numeric') .
      $this->generateRandomString($length-$numeric, 'alpha')
    );
  }
}

$generator = new StringGenerator;
for ($c=0; $c<=10; $c++) {
  var_dump($generator->generateAlphaNumString(10, 5));
}

有多少个字母和多少个数字?如果
$length<2
,则不能同时包含这两个字母和数字。如果假定它是随机的,则不能期望它总是包含数字…还有,
rand()
不是真正的随机。数字没有限制。但是字符串应该至少包含一个数字。与现在不同,因为有时它生成的字符串没有任何数字。这往往会将数字集中在字符串的开头,从而使其随机性降低。我认为这有点低效。这是著名的“随机排序算法”…很好!你应该在递归调用之前添加
return
。很好。编辑了我的答案。如果效率是一个主要问题,这可能不是最好的解决方案,但第二次迭代的可能性相当小,所以在大多数情况下,我认为这是可行的。谢谢。它工作得很好,很干净。非常感谢。但是我可以rando吗当我被迫输入数字时,将数字的位置最小化?是的,这是可能的。我改进了代码,在随机位置插入最后选择的字符。感谢代码中的更改和注释。注释对我的帮助很大,因为我是一个新手。:)即使对于非新手,注释也是好代码的重要组成部分。很高兴你能欣赏它!这修复了生成的数字的数量(本例中为5),这使得它比原始数字随机性更小。@trincot确实如此,这是我理解OPs问题的方式,尽管我同意这可以从不同的角度来看待。。。没有什么能反对在最后一次调用中随机化数字的数量,尽管……这是一个更好的解决方案
string(10) "J5F4FQX480"
string(10) "Z2g647pO9a"
string(10) "159Mf8GEL3"
string(10) "B5P57I42hN"
string(10) "Us97v5cg80"
string(10) "34VEHY825t"
string(10) "V6Ei5p06s1"
string(10) "YS5noD5127"
string(10) "4dJ4Y4G4q4"
string(10) "C8V7W3Q2G9"
string(10) "gu28g99H9d"