2015-04-15 35 views
0

我有一個2d數組。假設每個職位我有一個數字os候選人來填補它。PHP - 二維數組中的所有排列 - 唯一和有序的值

例:

Position 0 -> Candidates: 1,2,3 
Position 1 -> Candidates: 3,4,5 
Position 2 -> Candidates: 4,5 

翻譯:

Array_Position(
    array('1', '2', '3'), 
    array('3', '4','5'), 
    array('4', '5') 
); 

我希望所有的組合,用2個限制:

  1. 不重複(如果考生已經在一個位置,它不會再出現在另一個位置)。
    這不容發生:
    1-4-4
    3-3-4

  2. 候選不容比他以前的 「小」。
    這不容發生:
    1-5-4
    3-5-4

在這種特殊情況下,所有可能的組合是:
1-3-4
1-3-5
1-4-5
2-3-4
2-3-5
2-4-5
3-4-5

我看到一些這樣的答案:

<?php  
    function array_cartesian() { 
     $_ = func_get_args(); 
     if(count($_) == 0) 
      return array(array()); 
     $a = array_shift($_); 
     $c = call_user_func_array(__FUNCTION__, $_); 
     $r = array(); 
     foreach($a as $v) 
      foreach($c as $p) 
       $r[] = array_merge(array($v), $p); 
     return $r; 
    } 

    $cross = array_cartesian(
     array('1', '2', '3'), 
     array('3', '4','5'), 
     array('4', '5') 
    ); 

    print_r($cross); 

?> 

但他們都沒有解決2限制。

任何幫助?

Tks!

回答

0

由於任何候選人不能小於他以前的任何位置,因此任何位置都不能在連鎖中重複。下面的代碼會訣竅,檢查它是否適合你。

<?php 

function permute() 
{ 
    $result = array(); 

    if (func_num_args() == 0) 
     return $result; // empty array 

    foreach (func_get_arg(0) as $value) 
     nextPermute($result, $value, $value, 1, func_get_args()); 

    return $result; 
} 

function nextPermute(&$result_array, $permute_value, 
        $last_value, $next_arg, $all_args) 
{ 
    if ($next_arg < count($all_args)) 
    { 
     foreach ($all_args[$next_arg] as $value) 
      if ($value > $last_value) 
       nextPermute($result_array, $permute_value . '-' . $value, $value, $next_arg + 1, $all_args); 
    } 
    else 
     array_push($result_array, $permute_value); 
} 

$cross = permute(
    array('1', '2', '3'), 
    array('3', '4', '5'), 
    array('4', '5') 
); 

print_r($cross); 

?> 
+0

它工作完美。非常感謝你! – Erick

+0

很高興聽到它有效@Erick,如果這是正確的答案,請點擊答案左側的複選標記。 :) –