我有一组数据,其中每个项目都有不同类型的'range from'和'range to'字符串。例如,第一项可能有3001A - > 4000A和下一个项目可能是DE25500 - > DE27419等(有几种不同的模式,但通常由静态部分和范围部分组成(似乎通常任何字母都是静态的,数字可以是静态的或不是静态的)。
PHP中是否有任何现成的函数可以处理生成范围中的中间值?或者,如果没有关于如何建立一个的提示?
答案 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;
}
}
}
仅适用于当前范围相等的长度