Как получить все перестановки нужной длины из строки?

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

Но теперь я хочу перестановки целых слов, например,

$source = "apple,potatoes,orange";

К сожалению, эта функция дает мне только перестановки с символами, а не целыми словами, и я не знаю, как изменить код, поэтому я бы получил эти перестановки из приведенных выше примеров данных:

apple,apple
apple,potatoes
apple,orange
potatoes,apple
potatoes,potatoes
potatoes,orange
//...

Код:

<?php

$source = 'AaBbCcDdEe';

foreach(combos_with_repetition($source, 2) as $combo) {
echo "$combo<br>\n";
}

function combos_with_repetition($input, $combo_len = 2)
{
for($i = 0; $i < $combo_len; ++$i)
{
@$part1 .= 'for($k'.$i.' = 0, $len = strlen($input); $k'.$i.' < $len; ++$k'.$i.') ';
@$part2 .= ($i?'.':'') . '$input[$k'.$i.']';
}
eval($part1.'$rtn[] = '.$part2.';');
return $rtn;
}

?>

Так что любая помощь или подсказки, как изменить код, могут помочь.

0

Решение

Это должно работать для вас и даже без evil(),

Так что же делает этот код?

1. Сколько существует перестановок?

Довольно просто:

NL = количество перестановок

куда n это количество слов и l желаемая длина каждой комбинации.

Так что для этого конкретного примера есть 3 слова (apple, patatoes а также orange) и мы хотим, чтобы каждая перестановка имела длину 3. Значит:

33 = 27 перестановок

2. Получение всех перестановок вместе

Мы перебираем все наши перестановки, которые у нас уже есть (начиная с одной перестановки, «пустая перестановка» ($permutations = [[]];)), и для каждой перестановки мы проходим наш массив данных и объединяем каждую перестановку с каждой входной информацией в новую перестановку.

Теперь мы делаем это, пока не получим желаемую длину для каждой перестановки.

2.1 Пример

Input data:

[1, 2]     //Input array with the data
length = 2 //Desired length for each permutation

                               //↓ new permutations for the next iteration
│
iteration 0:

Permutations:
- []         │  -> []
│
iteration 1:        ┌─────────────┤
│             │
Permutations:   v             v
- []    + 1  │  -> [1]
- []    + 2  │  -> [2]
│
iteration 2:        ┌─────────────┤
│             │
Permutations:   v             v
- []    + 1  │  -> [1]
- []    + 2  │  -> [2]
- [1]   + 1  │  -> [1,1]  //desired length 2
- [1]   + 2  │  -> [1,2]  //desired length 2
- [2]   + 1  │  -> [2,1]  //desired length 2
- [2]   + 2  │  -> [2,2]  //desired length 2
//↑ All permutations here

Итак, как вы можете видеть в приведенном выше примере, у нас теперь есть все перестановки с желаемой длиной, которую мы хотим, здесь 2.

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

3. Код:

<?php

function getPermutations($input = [], $length = 2, $delimiter = ",") {
$permutations = [[]];
$data = is_array($input) ? $input : explode($delimiter, $input);

for ($count = 0; $count < $length; $count++) {
$tmp = [];
foreach ($permutations as $permutation) {
foreach ($data as $inputValue)
$tmp[] = array_merge($permutation, [$inputValue]);

}
$permutations = $tmp;
}

return $permutations;

}


$result = getPermutations("apple,patatoes,orange", 3);
print_r($result);

?>

выход:

Array
(
[0] => Array
(
[0] => apple
[1] => apple
[2] => apple
)
//...
[26] => Array
(
[0] => orange
[1] => orange
[2] => orange
)

)
3

Другие решения

это должно сделать работу за вас:

function test($source){
$source_array = explode(',',$source);
$result = '';
foreach($source_array as $item)
{
foreach($source_array as $item2){
$result .= $item.','.$item2.'<br>';
}
}
return $result;
}

$source="apple,patatoes,orange";
echo test($source);
1

По вопросам рекламы [email protected]