Php 如何生成由4个数字和2个A-Z字符组成的每个模式组合
我写了一个小脚本与一个朋友提供的数据库进行对话,这样我就可以将荷兰邮政编码与街道名称联系起来。但是我想自己做 邮政编码是像Php 如何生成由4个数字和2个A-Z字符组成的每个模式组合,php,loops,combinations,Php,Loops,Combinations,我写了一个小脚本与一个朋友提供的数据库进行对话,这样我就可以将荷兰邮政编码与街道名称联系起来。但是我想自己做 邮政编码是像NNNNCC一样构建的,其中N是一个数字0-9(不可能忽略第一个0的0000-0999),并且C=字符a-Z 如何在PHP中生成所有可能的组合?简单的foreach嵌套循环如下: foreach(range(1000,9999) as $num) foreach(range('A', 'Z') as $c1) foreach(range('A', '
NNNNCC
一样构建的,其中N
是一个数字0-9(不可能忽略第一个0的0000-0999),并且C
=字符a-Z
如何在
PHP
中生成所有可能的组合?简单的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会处理它…简单的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会处理它…以@dWinder answer为基础构建。您可以构建一个列表
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);
foreach(范围(09999)为$num)
foreach(范围('A','Z')为$c1)
foreach(范围('A','Z')为$c2)
//总共有6760000件
//$zips[]=sprintf(“%04s%s%s
”,$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';
}
echo testZipNl('1t00AA')。'1t00AA
';
echo testZipNl('11000AA')。'11000AA
';
echo testZipNl('1000AA')。'1000AA
';
函数testZipNl($input){
$input=修剪($input);
$regex=“/^[0-9]{4}[A-Z]{2}$/”;
if(preg_match($regex,$input)和strlen($input)==6){
返回“True”;
}
返回“False”;
}
以@dWinder answer为基础构建。您可以构建一个列表
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);
foreach(范围(09999)为$num)
foreach(范围('A','Z')为$c1)
foreach(范围('A','Z')为$c2)
//总共有6760000件
//$zips[]=sprintf(“%04s%s%s
”,$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';
}
echo testZipNl('1t00AA')。'1t00AA
';
echo testZipNl('11000AA')。'11000AA
';
echo testZipNl('1000AA')。'1000AA
';
函数testZipNl($input){
$input=修剪($input);
$regex=“/^[0-9]{4}[A-Z]{2}$/”;
if(preg_match($regex,$input)和strlen($input)==6){
返回“True”;
}
返回“False”;
}
您可以使用一个简单的类似寻呼机的功能来避免内存问题:
<?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
您可以使用一个简单的类似寻呼机的功能来避免内存问题:
<?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
看看递归:那么你需要1000AA
通过9999ZZ
?看看递归:那么你需要1000AA
通过9999ZZ
?我正要写一些类似的东西。对我来说是可行的,但是PHP由于数组分配而耗尽了内存;甚至直接输出到浏览器也会导致一些连锁反应我希望OP能将这些数据插入DB或其他什么东西。优雅的解决方案,非常简单,并且很容易看到发生了什么。我甚至喜欢将我的单线块用括号括起来,但这太紧凑了,所以需要额外的注意!@MonkeyZeus如果你做一些简单的事情,你可以使用一个生成器来处理内存问题g与价值观immediatly@Brice我在生成器方面没有太多经验,但您能否通过直接在循环中处理值而不是分配给$res[]
?生成器是否支持echo generator()之类的语法来避免内存问题[54]
这样我就可以提取第55个组合了?@MonkeyZeus你可以把答案封装在一个函数中,把yeild
放在$res[]=
的位置上。然后你可以对每个(generatorFunction()作为$value){
doWhateverYouWantTo($value);
>
不必在内存中保存整个数组,你只需实时执行你想要的任何操作,我想你实际上不需要生成器,因为这只是一个想法。我正要写一些类似的东西。对我来说是可行的,但由于数组分配,PHP内存不足;甚至直接输出到浏览器也会导致一些错误我希望OP能将这些数据插入DB或其他什么东西。优雅的解决方案,非常简单,并且很容易看到发生了什么。我更喜欢将我的一行数据块包装在括号中,但这太紧凑了,所以需要额外注意!@MonkeyZeus如果你正在做某些事情,你可以使用一个生成器来处理内存问题与价值观的冲突immediatly@Brice我在生成器方面没有太多经验,但您能否通过直接在循环中处理值而不是分配给$res[]
?生成器是否支持echo generator()之类的语法来避免内存问题[54]
这样我就可以提取第55个组合了?@MonkeyZeus你可以把答案封装在一个函数中,把yeild
放在$res[]=
的位置上。然后你可以对每个(generatorFunction()作为$value){
doWhateverYouWantTo($value);
>
不必在内存中保存整个阵列,您只需实时执行您想要的任何操作,我想您实际上不需要生成器,因为这只是一个想法。