У меня есть функция, где я могу передать строку и желаемую длину, чтобы получить все перестановки с фиксированной длиной из символов строки.
Но теперь я хочу перестановки целых слов, например,
$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;
}
?>
Так что любая помощь или подсказки, как изменить код, могут помочь.
Это должно работать для вас и даже без evil()
,
Так что же делает этот код?
Довольно просто:
NL = количество перестановок
куда n
это количество слов и l
желаемая длина каждой комбинации.
Так что для этого конкретного примера есть 3 слова (apple
, patatoes
а также orange
) и мы хотим, чтобы каждая перестановка имела длину 3. Значит:
33 = 27 перестановок
Мы перебираем все наши перестановки, которые у нас уже есть (начиная с одной перестановки, «пустая перестановка» ($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.
Но чтобы получить только перестановки с желаемой длиной, мы перезаписываем массив результатов каждую итерацию, так что в конце только перестановки с ожидаемой длиной находятся в массиве результатов.
<?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
)
)
это должно сделать работу за вас:
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);