Мой сценарий сосредоточен вокруг массива $givenNumbers
со случайным количеством случайных чисел от 1 до 1000:
$givenNumbers = [383, 886, 777, 84, 327, 336, 505, 846, 729, 313, 857, 124, 895, 582, 545, 814, 367, 434, 364, 43, 750, 87, 808, 276, 178, 788, 584, 403, 651, 754, 399, 932, 60, 676, 368, 739, 12, 226, 586, 94, 539, 654, 999, 5, 24];
Массив отсортирован и все повторения элементов удалены:
$givenNumbers = array_unique($givenNumbers);
sort($givenNumbers);
Затем я объявляю переменную $amount
, представляющую собой количество элементов в $givenNumbers
;
$amount = count($givenNumbers);
Теперь я сохраняю все возможные фрагменты массива в массиве $slices
, используяциклы:
$slices = [];
for ($i = 0; $i < $amount; $i++) {
for($j = 0; $j < $amount; $j++) {
array_push($slices, array_slice($givenNumbers, $i, $j));
}
}
Сохраняя все фрагменты в $slices
Я хочу найти все возможные комбинации из десяти фрагментов, которые, если объединить вместе, будут содержать все элементы $givenNumbers
, при этом ни один элемент не появится дважды или более.
Я пытался сделать это, циклически переключая ключи slices
:
$combinations[]
for($i = 0; $i < $amount; $i++) {
for($j = $i+1; $j < $amount; $j++) {
for($k = $j+1; $k < $amount; $k++) {
for($l = $k+1; $l < $amount; $l++) {
for($m = $l+1; $m < $amount; $m++) {
for($n = $m+1; $n < $amount; $n++) {
for($o = $n+1; $o < $amount; $o++) {
for($p = $o+1; $p < $amount; $p++) {
for($q = $p+1; $q < $amount; $q++) {
for($r = $q+1; $r < $amount; $r++) {
$combStorer = [];
$placeholder = array_merge($slices[$i], $slices[$j], $slices[$k], $slices[$l], $slices[$m], $slices[$n], $slices[$o], $slices[$p], $slices[$q], $slices[$r]);
$placeholder = array_unique($placeholder);
if (count($placeholder) == $amount) {
array_push($placeholder, $slices[$i], $slices[$j], $slices[$k], $slices[$l], $slices[$m], $slices[$n], $slices[$o], $slices[$p], $slices[$q], $slices[$r]);
foreach ($placeholder as $comb) {
$combStorer[] = $comb;
}
$combinations[] = $combStorer;
}
}
}
}
}
}
}
}
}
}
}
Это должно в основном найти все комбинации из десяти массивов в slices
, которые соответствуют моему требованию и хранилищуих в виде многомерного массива в $combinations
.
Однако, когда я открываю свой предварительный просмотр в реальном времени, я получаю фатальную ошибку, так как было превышено максимальное выполнение 30 секунд.
Several Пользователи обратили мое внимание на то, что этот метод слишком запутанный и что определенно есть лучшее решение.
Кто-нибудь может предложить более эффективное решение?