PHP字母和数字的组合算法以及从X位置开始

标签 php algorithm

我一直在使用这个算法,现在输出是这样的字符串:

AAA AAB AAC AAD AAE AAF AAG AAH AAI AAJ AAK AAL AAM AAN AAO AAP AAQ AAR AAS AAT AAU AAV AAW AAX AAY AAZ AA0 AA1 AA2 AA3 AA4 AA5 AA6 AA7 AA8 AA9 (END OF LOOP 1) ABA ABB ABC ABD ABE ABF ABG ABH ABI ABJ ABK ABL ABM ABN ABO ABP ABQ ABR ABS ABT ABU ABV ABW ABX ABY ABZ AB0 AB1 AB2 AB3 AB4 AB5 AB6 AB7 AB8 AB9 (END OF LOOP 2)

这工作得很好,但是,假设我想从 AB0 位置继续。在X位置之后如何继续?我一直在尝试实现位置保持器的代码,但我已经没有想法了,现在我已经抓狂了。

我的项目所做的是创建一些 text.txt 文件,其中包含下面的代码可以执行的所有可能的组合,但它会在一个长字符串/回显中回显所有内容,所以,我想要实现的是能够将这些 text.txt 文件分成多个部分。

例如,需要 5700 个组合(5700 个循环)、5 个包含 1000 个组合的 text.txt 以及一个包含剩余 700 个组合的 text.txt 文件。如何从循环 3000 继续而不从头开始?

这是我正在使用的代码:

<?php
ini_set('memory_limit', '3062M');
/*
Author: Luka Vidaković
Website: http://www.lvidakovic.com
Date: 21.2.2013.
*/
$charSet .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charSet .= '0123456789';

$size = strlen($charSet);
$base = array();
$counter = 0;

$maxLength = 3; // 3 for now to experiment
$baseSize = 3; // min

$loops_to_make = 1; // 0 will loop once. 1 will loop twice and so on...
$loops_done = 0;
$megavar = "";

while($baseSize <= $maxLength)
{
    if($loops_done > $loops_to_make) { break; }
    // Go through all the possible combinations of last character and output $base
    for($i = 0; $i < $size; $i++)
    {
        $base[0] = $i; //echo $i." ";
        for($j=$baseSize-1;$j>=0;$j--)
        {
            $megavar .= $charSet[$base[$j]];
        }
        $megavar .= ' ';    
    }
    // How many $base elements reached their max?
    for($i = 0; $i<$baseSize;$i++)
    {
        if($base[$i] == $size-1) { $counter++; $megavar .= "<br>|(".$j.")|"; }
        else break;
    }
    // Every array element reached max value? Expand array and set values to 0.
    if($counter == $baseSize)
    {
        // Notice <=$baseSize! Initialize 0 values to all existing array elements and ADD 1 more element with that value
        for($i=0;$i<=$baseSize;$i++)
        {
            $base[$i] = 0;
        }
        $baseSize = count($base);
    }
    // Carry one
    else
    {
        $base[$counter]++;
        for($i=0;$i<$counter;$i++) $base[$i] = 0;
    }
    $loops_done++;
    $counter=0;
}
echo $megavar; // Eventually I'll echo this into a txt file
?>

我也愿意接受其他想法,这些想法可以创建与 PHP 中的 long 相同的输出或更好的输出。 谢谢。

最佳答案

您的问题是计算给定字符串和给定位置之和的简单情况。唯一的困难是您的数字基数是 36 并且数字是自定义的。但这可以通过 strtr() 轻松解决。和 base_convert()组合:

function getSeed($string, $positions=1)
{
   $convert = array_combine(
                  array_merge(range('A', 'Z'), range('0', '9')),
                  array_merge(range('0', '9'), range('A', 'Z'))
              );
   //actually, $result can be written as one-liner
   //but that will be horrible whitespacing..
   $result  = base_convert(strtr($string, $convert), 36, 10);
   $result  = strtoupper(base_convert($result+$positions, 10, 36));
   $result  = strtr(str_pad($result, strlen($string), '0', STR_PAD_LEFT), array_flip($convert));
   return $result;
}

因此要使用它,只需调用:

$result = getSeed('AAA', 40);//ABE

因此,您将能够在循环中生成值或通过指定偏移量恢复循环。请注意,如果您要在循环中使用 $convert 外部函数,我建议您评估它。这将节省不必要的开销。

关于PHP字母和数字的组合算法以及从X位置开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20800449/

相关文章:

php - 为什么 GridFS 文件名和字节为空?

php - 为什么 Magento 在保存类别后只保留类别中的前 1000 个产品?

javascript - 力导向图布局的性能和复杂性?

algorithm - 数组的所有子集之间的最大异或

php - php while 循环中的 javascript

php - 如何阻止数据库数据破坏 HTML 页面?

php - 你可以在 ORDER BY 中添加 if 语句吗?

algorithm - 背包算法 : Why we use wt[i-1] instead of wt[i]

c++ - 生成除循环旋转之外的所有排列

algorithm - 参数相关的 PRNG