Создать диапазон между двумя буквенно-цифровыми значениями

1

У меня есть набор данных, где каждый элемент имеет строку "диапазон от" и "диапазон до" различных типов. Например, первый элемент может иметь 3001A → 4000A, а следующий элемент может быть DE25500 → DE27419 и т.д. (С несколькими различными шаблонами, но обычно он состоит из статического раздела и раздела диапазона (кажется, что обычно любая буква является статической и числа могут быть статическими или нет).

Есть ли готовая встроенная функция в PHP, которая может справиться с генерированием промежуточных значений в диапазоне? Или, если нет советов о том, как их построить?

  • 0
    "with several different...it seems..." Если вы можете точно определить правила для этой проблемы, то вы можете получить ответ, иначе все это просто гадание.
  • 0
    Это правда, извините за то, что был слишком расплывчатым. Предположим, что два приведенных примера являются основными шаблонами, которые мы видим в данных.
Теги:
range

3 ответа

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;
        }
    }
}

Работает только тогда, когда диапазоны равны по длине

0

Я предлагаю вам сначала найти все шаблоны, а затем написать функции, которые умеют подразделять числовую часть от литральной. Затем, чтобы работать с диапазонами в PHP, вы можете использовать http://php.net/range

  • 0
    к сожалению, данные могут изменяться или дополняться различными шаблонами, поэтому обнаружение шаблонов очень важно для этой задачи
  • 0
    ну, я думаю, в PHP нет волшебной функции, которая могла бы определять шаблоны для вас. Вы должны по крайней мере знать, что шаблоны могут быть сделаны числом, а затем буквой или двумя буквами, а затем числом
Показать ещё 1 комментарий
0

Я не эксперт по PHP, но не могу использовать цикл for для этого.

Вам нужно будет извлечь части ваших значений, которые представляют диапазоны, а затем запустить цикл от самого низкого до самого высокого.

$min = (int) substr("DE25500", 2)
$max = (int) substr("DE27419", 2)
for ($x = $min; $x <= $max; $x++) {
    // logic in here
}
  • 0
    Это сработало бы, если бы все данные были просто 2 буквами, а затем диапазоном, но это может означать DE, 2DE, диапазон, а затем DE и т. Д., Поэтому мне нужен какой-то способ определения того, что меняется, а что нет, а не в зависимости от набора количество символов

Ещё вопросы

Сообщество Overcoder
Наверх
Меню