Предположим, у меня есть массив, состоящий из символов из этих диапазонов «a-zA-Z0-9». Я хочу, чтобы все возможные комбинации были возможны в четырехбуквенном диапазоне. Символы могут повторяться в строке. Я ищу способ грубой силы сделать это.
Вот как я считаю, что итерация будет следующей:
"aaaa" "aaab" "aaac" … "9999"
В грубой форме:
$chars = array_merge(range('0', '9'), range('a', 'z'), range('A', 'Z')); $cnt = count($chars); $strings = array(); for ($first = 0; $first < $cnt; $first++) { for ($second = 0; $second < $cnt; $second++) { for ($third= 0; $third< $cnt; $third++) { for ($fourth= 0; $fourth < $cnt; $fourth++) { $strings[] = $chars[$first] . $chars[$second] . $chars[$third] . $chars[$fourth]; } } } }
В итоге у вас будет большой массив honkin, поэтому вы можете погрузить некоторые операции с базами данных в один из циклов, поэтому строки $ не становятся слишком большими и убивают ваш скрипт, нажимая ограничение на память.
к произвольному доступу вы можете использовать base_convert:
function getHash($i) { //- allowed Letters $letters = 'aAbBcCdDeEfFgG'; $len = strlen($letters); //- convert $i to base of $letters $i_in_base_of_letter = base_convert($i, 10, $len); //- replace letters return strtr($i_in_base_of_letter, '0123456789abcdefghijklmnopqrstuvwxyz', $letters); }
или manuel, если ваша база больше, чем 36 (у вас более 36 символов)
function getHash($i) { //- allowed Letters $letters = 'aAbBcCdDeEfFgG'; $letters_arr = str_split($letters, 1); $len = strlen($letters); $out =''; if ($i>0) { while ($i>0) { $r = $i % $len; $out = $letters_arr[$r] . $out; $i = floor ($i / $len); } return $out; } else { return $letters_arr[0]; } }
для итерации вы можете использовать:
for($i=0; $i<100; $i++) { echo getHash($i) ."\n"; }
таким образом, это не так быстро, как метод грубой силы.
С уважением Томас