当范围大小为1到100或A到Z时,使用PHP生成范围很容易。但我需要能够生成101A到101Z或A1到A100等范围。
我认为也许PHP有一个比较两个字符串的功能,去除它们之间的共同点并返回其余部分以形成范围边界。但是我找不到这样的功能。我怎么做到这一点?
编辑:我无法控制格式,我只能设置指南。最终用户通过在输入字段中输入A1-A100
之类的内容来确定模式。
答案 0 :(得分:0)
101A
至101Z
与"101" + range("A", "Z")
和
A1
至A100
与"A" + range(1, 100)
如果您正在寻找A1
到Z100
,那就会让事情变得复杂一些。
您可以查看基本转换器等功能的工作方式,例如dechex
和base64_encode
如果您从十进制系统转换为您自己的表示法,则可以进行某种转换。
1 => A1
2 => A2
101 => B1
102 => B2
2601? => Z1
2700? => Z100
这只描述了大纲。如果你想要代码,你必须更清楚地提出问题。
任意范围......非常难。我不知道解决方案。 A1-A100
有一个明确的解决方案,但A1-100Z
怎么样,你怎么开始呢?那么small-large
或Boston-New York
呢?
答案 1 :(得分:0)
您可以尝试:
function rangeFix($from, $to, $prefix = null, $suffix = null) {
return array_map(function($item) use ($prefix, $suffix){
return $prefix . $item . $suffix;
}, range($from, $to));
}
rangeFix(0, 10, 'A', 'Z');
输出:
array (size=11)
0 => string 'A0Z' (length=3)
1 => string 'A1Z' (length=3)
2 => string 'A2Z' (length=3)
3 => string 'A3Z' (length=3)
4 => string 'A4Z' (length=3)
5 => string 'A5Z' (length=3)
6 => string 'A6Z' (length=3)
7 => string 'A7Z' (length=3)
8 => string 'A8Z' (length=3)
9 => string 'A9Z' (length=3)
10 => string 'A10Z' (length=4)
或:
rangeFix('A', 'Z', 101);
输出:
array (size=26)
0 => string '101A' (length=4)
1 => string '101B' (length=4)
2 => string '101C' (length=4)
3 => string '101D' (length=4)
4 => string '101E' (length=4)
5 => string '101F' (length=4)
6 => string '101G' (length=4)
7 => string '101H' (length=4)
8 => string '101I' (length=4)
9 => string '101J' (length=4)
10 => string '101K' (length=4)
11 => string '101L' (length=4)
12 => string '101M' (length=4)
13 => string '101N' (length=4)
14 => string '101O' (length=4)
15 => string '101P' (length=4)
16 => string '101Q' (length=4)
17 => string '101R' (length=4)
18 => string '101S' (length=4)
19 => string '101T' (length=4)
20 => string '101U' (length=4)
21 => string '101V' (length=4)
22 => string '101W' (length=4)
23 => string '101X' (length=4)
24 => string '101Y' (length=4)
25 => string '101Z' (length=4)
答案 2 :(得分:0)
这是我自己的,不是那么优雅的解决方案。它使用以下逻辑:
范围边界有两部分,其中另一部分是数字,另一部分是非数字,例如A1
或1A
。单部分字符串也可用,例如A
或1
。我没有使用A1B
之类的字符串进行测试,其中有两个以上的部分。该脚本可能在那里失败。
$s1 = '101A';
$s2 = '101Z';
$s1_d = preg_split('/\d+/', $s1);
$s1_D = preg_split('/\D+/', $s1);
$s2_d = preg_split('/\d+/', $s2);
$s2_D = preg_split('/\D+/', $s2);
if($s1_d[0] == '') $s1_d[0] = $s1_D[0];
else $s1_d[1] = $s1_D[1];
$s1 = $s1_d;
if($s2_d[0] == '') $s2_d[0] = $s2_D[0];
else $s2_d[1] = $s2_D[1];
$s2 = $s2_d;
$prefix = false;
$postfix = false;
if($s1[0] == $s2[1]) die(); // Can't do it.
if($s1[0] == $s2[0]) {
$prefix = $s1[0];
$start = $s1[1];
$end = $s2[1];
}
else {
$postfix = $s1[1];
$start = $s1[0];
$end = $s2[0];
}
$range = range($start, $end);
foreach($range as &$r) {
$r = $prefix . $r . $postfix;
}
var_dump($range);