【问题标题】:How can I generate every combination of pattern of 4 numbers and 2 A-Z characters如何生成 4 个数字和 2 个 A-Z 字符的模式的每种组合
【发布时间】:2019-05-30 18:57:42
【问题描述】:

我编写了一个小脚本来与一个从朋友那里得到的数据库进行对话,这样我就可以将荷兰邮政编码与街道名称相关联。但我想自己做

邮政编码像NNNNCC 一样构建,其中N 是数字0-9(不能忽略第一个0 的0000-0999)和C = 字符A-Z。

如何在PHP 中生成所有可能的组合?

【问题讨论】:

标签: php loops combinations


【解决方案1】:

简单的foreach嵌套循环为:

foreach(range(1000,9999) as $num)
    foreach(range('A', 'Z') as $c1) 
        foreach(range('A', 'Z') as $c2)
            $res[] = $num . $c1 . $c2; 

我不在我的电脑前,如果有语法错误,我很抱歉(您可能需要将 $num 转换为字符串,但我猜 PHP 会处理它...

【讨论】:

  • 我正要写类似的东西。对我有用,但由于数组分配,PHP 内存不足;即使直接输出到浏览器也会导致一些严重的数据传输。我希望 OP 将其插入数据库或其他东西中。
  • 优雅的解决方案,非常简单且易于查看正在发生的事情。我更喜欢将我的单行块括在括号中,但这太紧凑了,所以加分!
  • @MonkeyZeus 如果您立即对这些值进行处理,您可以使用生成器来处理内存问题
  • @Brice 我对生成器没有太多经验,但是您不能通过在此处直接处理循环内的值而不是分配给$res[] 来避免内存问题吗?生成器是否支持echo generator()[54]; 之类的语法,以便我可以获取第 55 个组合?
  • @MonkeyZeus 您可以将答案包装在一个函数中,并用yeild 代替$res[] =。然后你可以做foreach(generatorFunction() as $value){doWhateverYouWantTo($value);},而不是把整个数组保存在内存中,你只需实时做任何你想做的事情,我猜你实际上并不需要生成器,因为它只是一个想法.
【解决方案2】:

以@dWinder 答案为基础。你可以建立一个列表。

foreach(range(0,9999) as $num)
    foreach(range('A', 'Z') as $c1) 
        foreach(range('A', 'Z') as $c2)
//      This comes out to 6,760,000 items
//          $zips[] = sprintf("%04s%s%s<br>", $num, $c1, $c2); 

如果你只是想检查格式,你可以做模式匹配。

echo testZipNl('1t00AA') .' 1t00AA<br>';

echo testZipNl('11000AA') .' 11000AA<br>';

echo testZipNl('1000AA') .' 1000AA<br>';


function testZipNl($input){
    $input = trim($input);
    $regex = "/^[0-9]{4}[A-Z]{2}$/";
    if (preg_match($regex, $input) AND strlen($input) == 6) {
     return 'True';
    }
 return 'False';
}

【讨论】:

    【解决方案3】:

    您可以使用类似寻呼机的简单功能来避免内存问题:

    <?php
    
    function codeRange(int $start, int $end) {
        $codes = [];
        $number = $start - 1;
        while ($number++ !== $end + 1) {
            $letter = 'AA';
            while ($letter !== 'AAA') {
                $codes[] = sprintf('%s%s', $number, $letter++);
            }
        }
    
        return $codes;
    }
    
    echo codeRange(1000, 1010)[0] . PHP_EOL;       // output: 1000AA
    echo codeRange(1000, 1010)[1] . PHP_EOL;       // output: 1000AB
    echo codeRange(1000, 1010)[2] . PHP_EOL;       // output: 1000AC
    echo codeRange(1000, 1010)[7434] . PHP_EOL;    // output: 1010ZY
    echo codeRange(1000, 1010)[7435] . PHP_EOL;    // output: 1010ZZ
    echo codeRange(9979, 9998)[0] . PHP_EOL;       // output: 9979AA
    echo codeRange(9979, 9998)[14195] . PHP_EOL;   // output: 9999ZZ
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-06
      • 1970-01-01
      • 2010-12-27
      • 2011-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多