|
Тема |
PHP - array - комбинции на елементите от масива |
|
Автор |
divech (непознат
) |
|
Публикувано | 22.04.07 19:42 |
|
|
Първо малко въведение:
Имам един масив, който е с размерност максимум 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 елемента изобщо несработва.
Някой може ли да ми помогне по какъвто и да е начин. Почерпката е гарантирана.
Благодаря предварително.
|
| |
|
|
|