更复杂的范围生成

时间:2014-01-30 14:41:06

标签: php

当范围大小为1到100或A到Z时,使用PHP生成范围很容易。但我需要能够生成101A到101Z或A1到A100等范围。

我认为也许PHP有一个比较两个字符串的功能,去除它们之间的共同点并返回其余部分以形成范围边界。但是我找不到这样的功能。我怎么做到这一点?

编辑:我无法控制格式,我只能设置指南。最终用户通过在输入字段中输入A1-A100之类的内容来确定模式。

3 个答案:

答案 0 :(得分:0)

101A101Z"101" + range("A", "Z")

类似

A1A100"A" + range(1, 100)

类似

如果您正在寻找A1Z100,那就会让事情变得复杂一些。 您可以查看基本转换器等功能的工作方式,例如dechexbase64_encode

如果您从十进制系统转换为您自己的表示法,则可以进行某种转换。

1 => A1
2 => A2
101 => B1
102 => B2
2601? => Z1
2700? => Z100

这只描述了大纲。如果你想要代码,你必须更清楚地提出问题。


任意范围......非常难。我不知道解决方案。 A1-A100有一个明确的解决方案,但A1-100Z怎么样,你怎么开始呢?那么small-largeBoston-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)

这是我自己的,不是那么优雅的解决方案。它使用以下逻辑:

范围边界有两部分,其中另一部分是数字,另一部分是非数字,例如A11A。单部分字符串也可用,例如A1。我没有使用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);