Страницы

Поиск по вопросам

пятница, 14 февраля 2020 г.

возможные комбинации массива php

#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



Еще вариант с рекурсией:

Комментариев нет:

Отправить комментарий