ProfiPHPProfiPHP
Категория: Полезное в PHP

Перебор всех возможных комбинаций символов определенной длины в PHP

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

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

Перебор осуществляется так:
$characters = 'abcd';
$length = 2;
$words = array( );
function searchWords( $prefix )
{
global $characters, $length, $words;
if ( strlen( $prefix ) == $length ) {
$words[ ] = $prefix;
return;
}
for ( $i = 0; $i < strlen( $characters ); $i++ )
searchWords( $prefix . $characters{$i} );
}
searchWords( '' );
Давайте разберем данный код.

В переменной Characters мы указываем список символов, которые будут участвовать в переборе.

Переменная Length содержит длину строки для перебора.

В переменной Words будут хранится все возможные варианты перебора.

После инициализации функции SearchWords мы объявляем только что описанные глобальные переменные. Делается это для того, чтобы данные переменные были доступны для всех вызовов данной функции.
global $characters, $length, $words;
Далее следует условие:
if ( strlen( $prefix ) == $length ) {
$words[ ] = $prefix;
return;
}
Данным условием мы проверяем равенство длины строки перебора. Если длина совпадает, тогда в массив Words добавляем строку, а выражение Return немедленно прекращает выполнение текущей функции и возвращает свой аргумент как значение данной функции.

Следующий участок кода:
for ( $i = 0; $i < strlen( $characters ); $i++ )
searchWords( $prefix . $characters{$i} );
Данный цикл увеличивает длину строки на 1 символ и рекурсивно вызывает функцию SearchWords.

После выполнения всех возможных вариантов, результирующий массив Words будет иметь следующие значения:
Array
(
[0] => aa
[1] => ab
[2] => ac
[3] => ad
[4] => ba
[5] => bb
[6] => bc
[7] => bd
[8] => ca
[9] => cb
[10] => cc
[11] => cd
[12] => da
[13] => db
[14] => dc
[15] => dd
)
Единственным минусом данной функции есть ограничение на длину строки. Как видно из результата, мы имеем исключительно строки из двух символов.

Добавить комментарий

Имя:
Текст комментария: