Я бы поместил все символы в массив и написал бы рекурсивную функцию, которая «удалит» все оставшиеся символы. Если массив пуст, к ссылке передается массив.
<?php
$input = "hey";
function string_getpermutations($prefix, $characters, &$permutations)
{
if (count($characters) == 1)
$permutations[] = $prefix . array_pop($characters);
else
{
for ($i = 0; $i < count($characters); $i++)
{
$tmp = $characters;
unset($tmp[$i]);
string_getpermutations($prefix . $characters[$i], array_values($tmp), $permutations);
}
}
}
$characters = array();
for ($i = 0; $i < strlen($input); $i++)
$characters[] = $input[$i];
$permutations = array();
print_r($characters);
string_getpermutations("", $characters, $permutations);
print_r($permutations);
Распечатывает:
Array
(
[0] => h
[1] => e
[2] => y
)
Array
(
[0] => hey
[1] => hye
[2] => ehy
[3] => eyh
[4] => yhe
[5] => yeh
)
Ах да,
комбинации = порядок не имеет значения.
перестановки = порядок имеет значение.
Так, эй, хе, да, все это одна и та же комбинация, но 3 отдельные перестановки, как упомянуто. Следите за тем, чтобы масштаб предметов увеличивался очень быстро. Это называется факториал, и написано как 6! = 6 * 5 * 4 * 3 * 2 * 1 = 720 пунктов (для строки из 6 символов). Строка из 10 символов будет 10! = 3628800 перестановок, что является очень большим массивом. В этом примере это 3! = 3 * 2 * 1 = 6.