• Как генерировать последовательные (не случайные) строки, ограниченные заданными символами?

    @aleksandrvkh Автор вопроса
    Александр Маджугин, на самом деле там не далеко от нуля ушло и лимит в php кончился :)
    Понял, спасибо.
  • Как генерировать последовательные (не случайные) строки, ограниченные заданными символами?

    @aleksandrvkh Автор вопроса
    Александр, добрый день.

    Код отлично работал до момента, пока порядок чисел в 10-ном исчислении не достиг предела :)
    Оказалось, что base_convert имеет ограничение и к примеру значение 'ffffffffffffffffffffffffffffffff' уже сконвертировать не в состоянии. Прочитал на сайте php комментарии по использованию bcmul для обхода, но столкнулся с другой проблемой, что при инкременте bigint происходит преобразование во float.
    Старт: ffffffffffffffffffffffffffffffff
    16->10: 340282366920938463463374607431768211455
    10++: 3.4028236692094E+38
    PHP Warning: bcmod(): bcmath function argument is not well-formed
    PHP Warning: bcdiv(): bcmath function argument is not well-formed
    0

    Не сталкивались с подобным?

    Спасибо.
  • Как генерировать последовательные (не случайные) строки, ограниченные заданными символами?

    @aleksandrvkh Автор вопроса
    Спасибо! Все оказалось значительно проще. Всех благ.
  • Как генерировать последовательные (не случайные) строки, ограниченные заданными символами?

    @aleksandrvkh Автор вопроса
    Александр Маджугин, ушел изучать base_convert, в моем примере подход похожий, но все же иной. Спасибо.
  • Как генерировать последовательные (не случайные) строки, ограниченные заданными символами?

    @aleksandrvkh Автор вопроса
    Александр Маджугин, о инкременте я писал в вопросе:
    Пробовал использовать пример из интернета, который переводит строки из системы счисления в десятичную систему, другими словами находит порядковый номер строки в списке вариаций сочетаний при неизменном массиве, каждая последовательность будет иметь свой уникальный порядковый номер и не будет повторяться, но! Для данного метода значения строк 001, 01, 1 - это уникальные значения, но для меня это дубли.

    не устроил дублями, либо я неверно использовал пример:
    Пример кода

    <?php
    
    // Формируем рабочую систему (a-zA-Z0-9)
    $work = array(0,1,2,3,4,5,6,7,8,9);
    // буквы нижнего регистра
    for($i = 97; $i <= 102; $i++){
        $work[] = chr($i);
    }
    
         
    // проверим, что получилось, если нужно
    //print_r($work);
    
    // Теперь можно приступать к решению нашего примера
    // перебор будет в одном цикле, без рекурсии, и перебирать мы будем не буквы, а цифры
    
    // параметры перебора
    $min_length = 1;
    $max_length = 3; // поставим 3, чтобы хватило памяти для массива $result
    
    // определяем порядковый номер минимального значения длинной строки $min_length
    $min = str_to_dec(str_repeat($work[sizeof($work)- 1], $min_length-1), $work)+1;
    // определяем порядковый номер максимального значения длинной строки $max_length
    $max = str_to_dec(str_repeat($work[sizeof($work)- 1], $max_length), $work);
    
    // предварительно определить количество возможных значений перебора можно следующим образом
    // столько же итераций совершит цикл
    $size = $max - $min +1;
    
    $result = array();
    for($i = $min; $i <= $max; $i++ )
    {
        //$result = str_pad(dec_to_str($i, $work), 64, "0", STR_PAD_LEFT);
        $result = dec_to_str($i, $work);
    	if ($result > '0') {
    		//echo $i." - ".$result."\n";
    		tolog($i.' - '.$result);
    	}
    }
         
    // $result = массив, содержащий все возможные значения длинной строки от $min_length до $max_length
    //print_r($result);
         
    // для ускорения выполнения всего перебора , цикл от min до max можно разбить на несколько циклов
    // и запустить их к примеру с помощью pcntl_fork
    
    // методы
    /**
     * переводит строки из системы счисления $work в десятичную систему
     * другими словами находит порядковый номер строки в списке вариаций сочетаний
     * при неизменном массиве $work, каждая последовательность будет иметь свой уникальный порядковый номер
     * и не будет повторяться
     */
    function str_to_dec($s, $sys)
    {
        $sys = array_flip($sys);
         
        $j = -1;
        $result = 0;
        for($i = strlen($s)-1; $i >= 0; $i--)
        {
            $j++;
            $result += ($sys[$s[$j]]+1) * pow(sizeof($sys), $i);
        }
        return $result;
    }
    /**
     * переводит число $int (десятичная система) в систему исчисления $work
     */
    function dec_to_str($i, $work)
    {
        $r = sizeof($work);
        $w = '';
        while($i > 0)
        {
            $t = $i % $r;
            if($t == 0){
                $w .= $work[$r-1];
                $i = $i / $r -1;
            } else {
                $w .= $work[$t-1];
                $i = ($i - $t) / $r;
            }
        }
        return strrev($w);
    }

  • Как генерировать последовательные (не случайные) строки, ограниченные заданными символами?

    @aleksandrvkh Автор вопроса
    Александр Маджугин, да, простите, указал пример в изначальном вопросе. Последовательная нужна для того, что бы сохранить промежуточное состояние и стартануть с него же в дальнейшем, т.е. каждое последующее значение завязано на предыдущее. Там по сути автоинкремент идет сначала цифр, затем символов, как только символ достиг значения d - переход на новый разряд и так далее, пока не достигнет лимита в количество символов. Спасибо за ответы.