#php
Есть массив $test = ['a','b','c','d'];
Нужно в результате получить возможные комбинации данного массива, без павторов(a,b
| b,a) в нужном порядке-
a
b
c
d
a,b
a,c
a,d
b,c
b,d
c,d
a,b,c
a,b,d
....
Не могу сообразить как это реализовать.
Пробовал таким образом.
$test = ['a','b','c','d'];
$new = [];
foreach ($test as $value) {
$new[] = $value;
foreach ($test as $value1) {
if($value != $value1) {
// $new[] = $value;
$new[] = $value.','.$value1;
}
}
}
function sort_value_strlen($a, $b) {
return mb_strlen($a) - mb_strlen($b);
}
uasort($new, 'sort_value_strlen');
print_r($new);
Но это не работает как мне нужно. Результат
Array
(
[0] => a
[4] => b
[8] => c
[12] => d
[1] => a,b
[2] => a,c
[3] => a,d
[5] => b,a
[6] => b,c
[7] => b,d
[9] => c,a
[10] => c,b
[11] => c,d
[13] => d,a
[14] => d,b
[15] => d,c
)
Он не идет больше 2 значений + есть повторы (a,b | b,a)
И возможна ли реализация без использования функций?
Ответы
Ответ 1
Рекурсивный алгоритм на Python: def gen(lst, idx, result): if idx < 0: if len(result)> 0: print(result) else: gen(lst, idx - 1, result) gen(lst, idx - 1, lst[idx] + " " + result) gen(["a","b","c"], 2, "") a b a b c a c b c a b c PHP: $AA = array('a','b','c'); $BB = array(); function gen($A, $B, $idx) { if ($idx < 0) { if(sizeof($B)>0) print_r($B); return; } gen($A, $B, $idx - 1); array_unshift($B, $A[$idx]); gen($A, $B, $idx - 1); return; } gen($AA, $BB, sizeof($AA)-1); Нерекурсивный алгоритм - проходим в цикле по числам от 1 до 2^N-1, где N - длина массива, и представляем счётчик цикла в бинарном виде. K-й бит установлен - k-й элемент массива в комбинации присутствует L = ["a","b","c", "d"] for i in range(1, 1<0: if t & 1: result += L[k] t >>= 1 k += 1 print(result) >> a b ab c ac bc abc d ad bd abd cd acd bcd abcd Ответ 2
это задача на рекурсию $test = ['a','b','c','d']; function fillArray($incomeArr) { $outcomeArr = []; $firstLetter = $incomeArr[0]; $incomeArr = array_slice($incomeArr, 1); for( $i = 0; $i < sizeof($incomeArr); $i++ ) { $outcomeArr[] = $firstLetter . ',' . $incomeArr[$i]; } if (sizeof($incomeArr) > 1) { $outcomeArr = array_merge($outcomeArr, fillArray($incomeArr)); } return $outcomeArr; } var_dump( fillArray($test) ); идея в том, что a конкатенируем сначала с b, c, d. Потом берем b и конкатенируем с, d. Наконец, берем с + dОтвет 3
Еще вариант с рекурсией:
Комментариев нет:
Отправить комментарий