PHP - array - комбинции на елементите от масива

6 отговора 0 прегледа
#1

PHP - array - комбинции на елементите от масива

Първо малко въведение:
Имам един масив, който е с размерност максимум 20 неповтарящи се елемента (числа). Трябва ми от този масив да извлеча всичките неповтарящи се комбинации от "n" на брой елементи, като 4 < n < 12. С две думи нещо като "тотото" само че не е 6 от 49, а е 4....12 от 20. Надявам се да ме разбрахте каква е идеята.
Използвам следният скрипт:

<?
$b1 = 55;
$b2 = 65;
$b3 = 75;
$b4 = 85;
$b5 = 95;
$b6 = 105;
$b7 = 120;
$b8 = 130;
$b9 = 140;
$b10 = 150;


function array_permutations($input, $num)
{
$perms = $indexed = $output = array();
$base = count($input);
$i = 0;
foreach($input as $in)
$indexed[$i++] = $in;
foreach(range(0, pow($base, $num) - 1) as $i)
$perms[] = sprintf("%'0{$num}d", base_convert($i, 10, $base));
foreach(array_filter($perms, 'catch_duplicate_chars') as $perm)

{
$temp = array();
foreach(str_split($perm) as $digit)
$temp[] = $indexed[$digit];
$output[] = $temp;
}
return $output;
}
function catch_duplicate_chars($val)
{
$arr = str_split($val);
return $arr == array_unique($arr);
}

function array_combinations($input, $num)
{
$combos = array();
foreach(array_permutations($input, $num) as $row)
{
$copy = $row;
sort($copy);
$combos[implode(',', $row)] = implode(',', $copy);
}
return array_keys( array_unique($combos) );
}
$array_combinations = array_combinations(array($b1 , $b2 , $b3 , $b4 , $b5 , $b6 , $b7 , $b8 , $b9 , $b10), 5);
$display = '';
foreach($array_combinations as $row)
$display .= "$row\n";
print "<pre>$display</pre>";
?>

По горното работи, но за съжаление не точно както бих искал. До 10 елемента в масива, и до комбинация от 6 елемента, т.е. до 6 от 10 всичко е както трябва, но при въвеждането на повече от 10 елемента в масива и при комбинации до 6 елемента извежда само комбинациите на първите 10 елемента а тези след 10-я неучастват. А ако се зададе да изведе комбинациите на повече от 6 елемента изобщо несработва.

Някой може ли да ми помогне по какъвто и да е начин. Почерпката е гарантирана.
Благодаря предварително.

Отговор
в отговор на divech #2

Re: PHP - array - комбинции на елементите от масива

Тъпото решение.

1. правя нов масив
2. в цикъл обхождам дадения, и ако не срещам дадено число от стар масив отговарящо на условия да бъде вклъчено в нов 0 добавям.
3. повтарям т.2
4 връщам резултат.

Елементарното решение:

1. сортиране
2. ункално(пресичане(даден,филл(сротиране[0] сортиране[брой(соптиране)-1]))).

Отговор
в отговор на Bълk #3

Re: PHP - array - комбинции на елементите от масива

Нещо не разбрах елементарното решение. Според теб по този начин ще стане ли за мойте цели?

Мерси.

Отговор
в отговор на divech #4

Re: PHP - array - комбинции на елементите от масива

мда .. сега остава и аз да проумея какво съм написал....

Отговор
в отговор на divech #5

Re: PHP - array - комбинции на елементите от масив

Всъщност дори ако началните ти елементи са 20, количеството неповтарящи се комбинации от тях ще е 4845 (20!/(20 - 4)!/4! = 4845), т.е. може да се ползва и съвсем бабешки метод:

<?php
$b[0] = 55;
$b[1] = 65;
$b[2] = 75;
$b[3] = 85;
$b[4] = 95;
$b[5] = 105;
$b[6] = 120;
$b[7] = 130;
$b[8] = 140;
$b[9] = 150;
$b[10] = 160;
$b[11] = 170;
$b[12] = 180;
$b[13] = 190;
$b[14] = 210;
$b[15] = 220;
$b[16] = 230;
$b[17] = 240;
$b[18] = 250;
$b[19] = 260;

$res_cnt = 0;
for ($i = 0;$i < count($b) - 3;$i++)
{
$tmp_array[0] = $b[$i];
for ($j = $i + 1;$j < count($b) - 2;$j++)
{
$tmp_array[1] = $b[$j];
for ($k = $j + 1;$k < count($b) - 1;$k++)
{
$tmp_array[2] = $b[$k];
for ($l = $k + 1;$l < count($b);$l++)
{
$res_array[$res_cnt][0] = $tmp_array[0];
$res_array[$res_cnt][1] = $tmp_array[1];
$res_array[$res_cnt][2] = $tmp_array[2];
$res_array[$res_cnt][3] = $b[$l];
$res_cnt++;
}
}
}
}
print_r($res_array);
?>


Не е нужно елементите да се сортират предварително.

Отговор
в отговор на croesus #6

Re: PHP - array - комбинции на елементите от масив

Мерси за мнението croesus. Ще го разгледам по-подробно, но ми се струва че че мога да го използвам за мойте цели.

Отговор
в отговор на divech #7

Re: PHP - array - комбинции на елементите от масива

ч`ай, че и аз не мога да го разбера ....

Отговор