生成两个字母数字值之间的范围

时间:2015-11-13 12:58:38

标签: php range

我有一组数据,其中每个项目都有不同类型的'range from'和'range to'字符串。例如,第一项可能有3001A - > 4000A和下一个项目可能是DE25500 - > DE27419等(有几种不同的模式,但通常由静态部分和范围部分组成(似乎通常任何字母都是静态的,数字可以是静态的或不是静态的)。

PHP中是否有任何现成的函数可以处理生成范围中的中间值?或者,如果没有关于如何建立一个的提示?

3 个答案:

答案 0 :(得分:0)

我不是PHP专家,但你不能使用for循环。

您需要提取代表范围的值部分,然后从最低到最高开始循环。

$min = (int) substr("DE25500", 2)
$max = (int) substr("DE27419", 2)
for ($x = $min; $x <= $max; $x++) {
    // logic in here
}

答案 1 :(得分:0)

我建议你首先找到所有的模式,然后编写知道如何从数字部分细分数字部分的函数。 然后,要使用PHP中的范围,您可以使用http://php.net/range

答案 2 :(得分:0)

最终计算出一个完成此功能的函数......

function generateRange($startString, $endString, $step = 1)
{
    if (strlen($startString) !== strlen($endString)) {
        throw new LogicException('Strings must be equal in length');
    }

    // Get position of first character difference
    $position = mb_strlen(mb_strcut($startString, 0, strspn($startString ^ $endString, "\0")));
    if (!is_numeric($startString[$position]) || !is_numeric($endString[$position])) {
        throw new LogicException('The first character difference is not numeric');
    }

    // Get sequence
    $length = strspn($startString, '1234567890', $position);
    $prefix = substr($startString, 0, $position);
    $suffix = substr($startString, $position + $length);
    $start  = substr($startString, $position, $length);
    $end    = substr($endString, $position, $length);

    if ($start < $end) {
        if ($step <= 0) {
            throw new LogicException('Step must be positive');
        }
        for ($i = $start; $i <= $end; $i += $step) {
            yield $prefix . str_pad($i, $length, "0", STR_PAD_LEFT) . $suffix;
        }
    } else {
        if ($step >= 0) {
            throw new LogicException('Step must be negative');
        }
        for ($i = $start; $i >= $end; $i += $step) {
            yield $prefix . str_pad($i, $length, "0", STR_PAD_LEFT) . $suffix;
        }
    }
}

仅适用于当前范围相等的长度