在PHP中的字符串中随机插入一些未知长度的数字

okxuctiv  于 2023-04-04  发布在  PHP
关注(0)|答案(3)|浏览(131)

我用下面的函数创建一个给定长度的随机字符串:

function generateRandomString($length) {
    $characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[random_int(0, $charactersLength - 1)];
    }
    return $randomString;
}

这给了我一个结果,例如,当给它15作为长度时,aBcDEFghIJKlmNo
现在我也有一个变量,可以从1到10.000.000。为了简单起见,我们假设这个数字是12.345,但是解决方案需要对范围内的任何数字都有效。
我需要一个函数,它接受这个数字12.345,并将这些数字连续放入字符串aBcDEFghIJKlmNo的随机位置,得到的结果例如'a1BcD23EFg4hIJ5KlmNo'。

function placeNumberInString($string, $number){
    $new_string = '';

    // I can't figure out what to do here...

    return $new_string;
}

$result = placeNumberInString(aBcDEFghIJKlmNo, 12345);

echo $result;
slhcrj9b

slhcrj9b1#

这本质上是aBcDEFghIJKlmNo堆栈和12345堆栈之间的classic riffle shuffle的一次迭代。使用str_split()将每个堆栈拆分为数组,因此您有:

$one = ["a","B","c","D","E","F","g","h","I","J","K","l","m","N","o"];
$two = ["1", "2", "3", "4", "5"];

然后在这两个数组上执行shuffle:

  • 随机选择一个堆栈,但根据该堆栈中的元素数量进行加权。这可以确保当堆栈大小不同时,您可以获得均匀的分布。
  • 从该堆栈的前端/顶部取出一个元素,并将其添加到新合并堆栈的末尾。
  • 重复操作,直到没有剩余元素。

比如:

function riffle(string $one, string $two): string
{
  $new = '';
  $tot = strlen($one . $two);
  $from = [str_split($one), str_split($two)];
  while (array_filter($from)) {
    $new .= array_shift($from[lcg_value() <= count($from[0]) / $tot-- ? 0 : 1]);
  }
  return $new;
}
siotufzp

siotufzp2#

如果你想保持数字中数字的顺序,你可以一次只建立一个新的字符串。

$numberAsString = (string) $number;
$stringLength = strlen($string);
$numberStringLength = strlen($numberAsString);

$s = 0;
$i = 0;
while (($s < $stringLength) && ($i < $numberStringLength)) {
    if (random_int(0, 1)) {
        $newString .= $string[$s];
        $s++;
    } else {
        $newString .= $numberAsString[$i];
        $i++;
    }
}
if ($s < $stringLength) {
    $newString .= substr($string, $s);
} else {
    $newString .= substr($numberAsString, $i);
}
gojuced7

gojuced73#

可以从最后一个索引开始,按随机索引拆分字符串,然后插入数字

function placeNumberInString($string, $number){
    $new_string = $string;
    
    $numberArray = str_split((string)$number);
    
    $index = 0;

    foreach ($numberArray as $value) {
        $index = rand($index, strlen($new_string));
        
        $begin = substr($new_string, 0, $index + 1);
        $end = substr($new_string, $index + 1);
        
        $new_string = $begin . $value . $end;
    }

    return $new_string;
}

$result = placeNumberInString("aBcDEFghIJKlmNo", 12345);

echo $result;

相关问题