У меня есть набор данных, где каждый элемент имеет строку "диапазон от" и "диапазон до" различных типов. Например, первый элемент может иметь 3001A → 4000A, а следующий элемент может быть DE25500 → DE27419 и т.д. (С несколькими различными шаблонами, но обычно он состоит из статического раздела и раздела диапазона (кажется, что обычно любая буква является статической и числа могут быть статическими или нет).
Есть ли готовая встроенная функция в PHP, которая может справиться с генерированием промежуточных значений в диапазоне? Или, если нет советов о том, как их построить?
Выяснилось, что нужно сделать это в конце...
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;
}
}
}
Работает только тогда, когда диапазоны равны по длине
Я предлагаю вам сначала найти все шаблоны, а затем написать функции, которые умеют подразделять числовую часть от литральной. Затем, чтобы работать с диапазонами в PHP, вы можете использовать http://php.net/range
Я не эксперт по PHP, но не могу использовать цикл for для этого.
Вам нужно будет извлечь части ваших значений, которые представляют диапазоны, а затем запустить цикл от самого низкого до самого высокого.
$min = (int) substr("DE25500", 2)
$max = (int) substr("DE27419", 2)
for ($x = $min; $x <= $max; $x++) {
// logic in here
}
"with several different...it seems..."
Если вы можете точно определить правила для этой проблемы, то вы можете получить ответ, иначе все это просто гадание.