Пробовал использовать пример из интернета, который переводит строки из системы счисления в десятичную систему, другими словами находит порядковый номер строки в списке вариаций сочетаний при неизменном массиве, каждая последовательность будет иметь свой уникальный порядковый номер и не будет повторяться, но! Для данного метода значения строк 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);
}
Понял, спасибо.