在PHP中查找一个范围中所有值的最优雅/最有效的方法是什么?使用混合的字母数字边界


What's the most elegant / efficient way to find all values in a range in PHP, with mixed alphanumeric bounds?

给定两个字符串,找出它们之间的所有值:

find_range('1', '5') = ['1', '2', '3', '4', '5'];
find_range('A', 'E') = ['A', 'B', 'C', 'D', 'E'];
find_range('001', '005') = ['001', '002', '003', '004', '005'];
find_range('1A', '5A') = ['1A', '2A', '3A', '4A', '5A'];
find_range('GG1', 'GG5') = ['GG1', 'GG2', 'GG3', 'GG4', 'GG5'];
find_range('A1A', 'A5A') = ['A1A', 'A2A', 'A3A', 'A4A', 'A5A'];
find_range('1A', '1E') = ['1A', '1B', '1C', '1D', '1E'];
find_range('1', 'F') = null; // or exception

关于写find_range方法的最好方法有什么建议吗?

这是原始的实现:

var_dump(find_range('1', '5'));
var_dump(find_range('A', 'E'));
var_dump(find_range('001', '005'));
var_dump(find_range('1A', '5A'));
var_dump(find_range('GG1', 'GG5'));
var_dump(find_range('A1A', 'A5A'));
var_dump(find_range('1A', '1E'));
try {
    var_dump(find_range('1', 'F'));
} catch (Exception $e) {
    echo $e->getMessage(), "'n";
}
function find_range($from, $to)
{
    $begin = $end = null;
    foreach (str_split($from) as $i => $c) {
        if ($c != $to[$i] && $begin === null) {
            $begin = $i;
        } elseif ($c == $to[$i] && $begin !== null) {
            $end = $i;
        }
    }
    $prefix = $suffix = '';
    if ($end !== null) {
        $suffix = substr($from, $end - strlen($from));
    } else {
        $end = strlen($from) - 1;
    }
    if ($begin === null) {
        return null;
    }
    if ($begin > 0) {
        $prefix = substr($from, 0, $begin);
    }
    $dataBegin = substr($from, $begin, $end - $begin + 1);
    $dataEnd = substr($to, $begin, $end - $begin + 1);
    if (ctype_digit($dataBegin) !== ctype_digit($dataEnd) || ctype_alpha($dataBegin) !== ctype_alpha($dataEnd)) {
        throw new Exception('Incompatible types');
    }
    $range = range($dataBegin, $dataEnd);
    $rangeDecorated = array_map(function($i) use($prefix, $suffix) {
        return $prefix . $i . $suffix;
    }, $range);
    return $rangeDecorated;
}

在线演示:http://ideone.com/y41Hdz

不确定在这里解释任何东西是否有意义,因为代码是非常自解释的。