Как я могу сгенерировать каждую комбинацию из 4 цифр и 2 AZ символов - PullRequest
1 голос
/ 30 мая 2019

Я написал небольшой скрипт для связи с базой данных, которую получил от друга, чтобы я мог связать голландский почтовый индекс с названием улицы. Но я хочу сделать это сам

Почтовые коды создаются как NNNNCC, где N - это число 0-9 (игнорирование первых 0 0000-0999 невозможно) и C = символ A-Z.

Как я могу сгенерировать каждую возможную комбинацию в PHP?

Ответы [ 3 ]

3 голосов
/ 30 мая 2019

Простой вложенный цикл 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 справится с этим ...

1 голос
/ 31 мая 2019

Вы можете сделать это с помощью простой функции, похожей на пейджер, чтобы избежать проблемы с памятью:

<?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
1 голос
/ 30 мая 2019

Чтобы построить ответ @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';
}
...