Собрать все возможные комбинации чисел

103
02 мая 2021, 03:20

Есть массив вида:

[
[0] => [1, 2, 3],
[1] => [1, 2],
[2] => [1, 2, 3, 4]
];

Мне нужно собрать все возможные комбинации чисел, то есть, чтобы получилось:

[1, 1, 1],
[1, 1, 2],
[1, 1, 3],
[1, 1, 4],
[1, 2, 1]... и тд

Как это сделать? Может есть пример где посмотреть?

Answer 1

Сейчас не у компьютера, возможны ошибки. Но навскидку можно например так:

$arr = [
    [1, 2, 3],
    [1, 2],
    [1, 2, 3, 4]
];
$ab = [];
foreach($arr as $row){
    $ab = array_values(array_unique(array_merge($ab, $row)));
}
$result=[];
$k = 1;
$k1 = 1;
for ($i = 0; $i < count($ab) * count($ab); $i++) {
    for ($j = 0; $j < count($ab); $j++) {
        $result[$i][] = [$k, $k1, $ab[$j]];
    }
    if($k1 == count($ab)){
        $k++;
        $k1=1;
    }else{
        $k1++;
    }
}
echo '<pre>';
print_r ($result);
echo '</pre>';
Answer 2

Вот тут еще есть решение.

function get_combinations($arrays) {
    $result = array(array());
    foreach ($arrays as $property => $property_values) {
        $tmp = array();
        foreach ($result as $result_item) {
            foreach ($property_values as $property_value) {
                $tmp[] = array_merge($result_item, array($property => $property_value));
            }
        }
        $result = $tmp;
    }
    return $result;
}
READ ALSO
Как изменить имя отправителя в mail() при использовании ssmtp?

Как изменить имя отправителя в mail() при использовании ssmtp?

Не как не могу разобраться с именем отправителяУ меня nginx, debian, ssmtp, php

128
Ширина столбца в PhpSpreadsheet

Ширина столбца в PhpSpreadsheet

спасайте, потому, что это хаос блин

134
Как отправить куки в middleware Laravel?

Как отправить куки в middleware Laravel?

Как отправить куки непосредственно в мидлвере? Вариант

92
Забрать текст между &lt;BR&gt; регулярка php

Забрать текст между <BR> регулярка php

Например, есть произвольные данные вида:

75