给定两个字符串,找出它们之间的所有值:
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
不确定在这里解释任何东西是否有意义,因为代码是非常自解释的。