PHP - генерировать все комбинации элементов в массиве - PullRequest
0 голосов
/ 03 октября 2019

У меня есть такой массив PHP ...

$myarray = array(
'red', 'yellow', 'green, 'blue'
);

Порядок для меня не имеет значения, поэтому я думаю, что пытаюсь вычислить combinations, а не permutations. Я хочу получить это обратно ...

$finalarray = array(
    'Red', 'Green',
    'Red', 'Yellow',
    'Red', 'Blue',
    'Green', 'Yellow',
    'Green', 'Blue',
    'Yellow', 'Blue'
);

Есть ли встроенная функция PHP для достижения этого или есть способ сделать это с помощью циклов?

Ответы [ 2 ]

1 голос
/ 03 октября 2019

Конечно, вы можете использовать библиотеки перестановок, но вам нужно sort каждый отдельный подрешеток в алфавитном порядке и удалять дубликаты с помощью array_unique().

Или вы можете попытаться быть более экономически эффективным:

$myarray = array(
'red', 'yellow', 'green', 'blue'
);

$result = [];

while ($item = array_pop($myarray)) {
    foreach($myarray as $couple) {
        $result[] = [$item, $couple];
    }
}

print_r($result);

Во-первых, вы сокращаете исходный массив каждый шаг, и каждый контекст должен иметь свою копию массива. Это означает, что если вы хотите инкапсулировать механику в рекурсивную функцию для создания более двух массивов-членов, вам нужно предотвратить изменение их внутренних копий чем-либо еще, кроме array_pop их собственного контекста.

Для объяснения приведенного выше кода я выталкиваю один элемент из верхней части исходного массива, а затем перебираю оставшийся элемент, чтобы связать пару. Таким образом, я не буду сочетать «красный» с «красным» и не буду создавать неупорядоченные дубликаты.

1 голос
/ 03 октября 2019

Этот пример ниже

 $myarray = array( 'red', 'yellow', 'green', 'blue' );
 $finalarray = [];
 for ($i = 0; $i < count($myarray); $i++) {
     for ($j = $i + 1; $j < count($myarray); $j++) {
         $finalarray[] = $myarray[$i];
         $finalarray[] = $myarray[$j];
     }
 }
 print_r($finalarray);

напечатает это

 Array ( [0] => red [1] => yellow [2] => red [3] => green [4] => red [5] => blue [6] => yellow [7] => green [8] => yellow [9] => blue [10] => green [11] => blue )
...