Задать вопрос

Перебор возможных значений в PHP?

Подскажите готовый класс/функцию или способ генерации всех возможных решений с алфавитом A и длиной строки N

Т.е. если $A='01'; и $N=3; то будет

000

001

010

011

100

101

110

111
  • Вопрос задан
  • 5599 просмотров
Подписаться 7 Оценить 2 комментария
Решения вопроса 1
Dzuba
@Dzuba
Способ называется рекурсия. Накидал пример на коленке:
$alphabet = 'abcd';
$length = 5;
$words = array();

function makeword($prefix)
{
	global $alphabet, $length, $words;
	if (strlen($prefix) == $length)
	{
		$words[] = $prefix;
		return;
	}
	for ($i = 0; $i < strlen($alphabet); $i++)
		makeword($prefix . $alphabet{$i});
}

makeword('');

// Все слова - в массиве $words
echo count($words);
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
stas_agarkov
@stas_agarkov
Я программист
такое на первом курсе пишут… :(
Ответ написан
Комментировать
yaksa
@yaksa
Первое, что приходит на ум искать брут скрипты.
Ответ написан
message
@message
Как и сказала Алиса, тут брутфорс подходит, я тоже о нём сразу подумал… Вот сделал под вашу нужду.
<?php

$text_lenght = 3;
$charset = '01';
$charset_length = strlen($charset);

function recurse($width, $position, $base_string)
{
    global $text_lenght, $charset, $charset_length;
     
    for ($i = 0; $i < $charset_length; ++$i) {
        if ($position  < $width - 1) {
            recurse($width, $position + 1, $base_string . $charset[$i]);
        }
		if (strlen($base_string . $charset[$i]) == $text_lenght) {
			echo $base_string . $charset[$i].'
';
		}		

    }
}

recurse($text_lenght, 0, '');
?>

Надеюсь это то что вам нужно
Ответ написан
Kindman
@Kindman
Если алфавит не больше 36 знаков, то можно сделать так:
<?php
function brut36($A="0123456789", $N=1)
    {
    $base="0123456789abcdefghijklmnopqrstuvwxyz";
    $b=strlen($A);
    $count=pow($b, $N);
    for ($i=0;$i<$count;$i++)
      echo strtr(str_pad(base_convert($i, 10, $b), $N, "0",
        STR_PAD_LEFT), $base, $A),"\r\n";
    }

brut36("01", 3);
на выходе получаем:

000
001
010
011
100
101
110
111
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы