2017-05-23 11 views
0

私は$myArrayですが、常に5つの数字を含むサブアレイがあります。数字はサイズでソートされ、サブアレイで繰り返すことはできませんが、より多くの「同一」サブアレイ同じ番号)を$myArrayに入力します。PHP:どのようにサブ配列の最も一致する組み合わせを取得するには?

$myArray = array(
array(1,2,3,4,5), 
array(5,6,10,18,20), 
array(1,2,3,4,5), 
array(2,3,4,5,9), 
array(1,2,3,7,9), 
array(1,3,4,5,7), 
array(2,3,4,7,9), 
array(2,4,5,10,29), 
array(1,8,10,11,15) // etc. 
); 

どのようにこの組み合わせ(またはむしろこの$ n個の組み合わせから生成された5個の組み合わせ)が$myArrayのサブアレイのほとんど一致する$n数字の組み合わせ(アレイ)を得ることができ?

:この結果から誘導合計21 5個の組み合わせが存在するので、$myArrayため$n=7ための望ましい結果は、array(1,2,3,4,5,7,9)あろう:

1,2,3,4,5 
1,2,3,4,7 
1,2,3,4,9 
//... and so on 

は、これらの組み合わせは、ほぼ一致しすべてのサブアレイ(2番目と最後の2つのサブアレイのみが範囲外です)。

私は

答えて

0
     class Combinations implements Iterator 
         { 
          protected $c = null; 
          protected $s = null; 
          protected $n = 0; 
          protected $k = 0; 
          protected $pos = 0; 

          function __construct($s, $k) { 
           if(is_array($s)) { 
            $this->s = array_values($s); 
            $this->n = count($this->s); 
           } else { 
            $this->s = (string) $s; 
            $this->n = strlen($this->s); 
           } 
           $this->k = $k; 
           $this->rewind(); 
          } 
          function key() { 
           return $this->pos; 
          } 
          function current() { 
           $r = array(); 
           for($i = 0; $i < $this->k; $i++) 
            $r[] = $this->s[$this->c[$i]]; 
           return is_array($this->s) ? $r : implode('', $r); 
          } 
          function next() { 
           if($this->_next()) 
            $this->pos++; 
           else 
            $this->pos = -1; 
          } 
          function rewind() { 
           $this->c = range(0, $this->k); 
           $this->pos = 0; 
          } 
          function valid() { 
           return $this->pos >= 0; 
          } 
          // 
          protected function _next() { 
           $i = $this->k - 1; 
           while ($i >= 0 && $this->c[$i] == $this->n - $this->k + $i) 
            $i--; 
           if($i < 0) 
            return false; 
           $this->c[$i]++; 
           while($i++ < $this->k - 1) 
            $this->c[$i] = $this->c[$i - 1] + 1; 
           return true; 
          } 
         } 







      $tickets = array(
       array(1,2,3,4,5), 
       array(5,6,10,18,20), 
       array(1,2,3,4,5), 
       array(2,3,4,5,9), 
       array(1,2,3,7,9), 
       array(1,3,4,5,7), 
       array(2,3,4,7,9), 
       array(2,4,5,10,29), 
       array(1,8,10,11,15) // etc. 
      ); 
    // first we need to find all numbers that are actually in one of the arrays. 

      foreach($tickets as $anArray) { 
       foreach($anArray as $aNumberUsed){ 
        $numbersUsed[$aNumberUsed] = $aNumberUsed; 
       } 
      } 
    // next we assign the number of integers in the set we are looking for.  
      $r = 7; 
// next we run the above class on our array (which gets us all of the possible combinations of these numbers). 
      foreach(new Combinations($numbersUsed, 7) as $comboKey => $substring){ 
       $comboList[$comboKey] = $substring; 
       $countWins = 0; 
// here we loop through all of the 5 number arrays, and flag any array who has all the variables in this iteration of the possible numbers. There are cleaner ways to do this, but this is easy to understand. 
       foreach($tickets as $valueList) { 
        $countNumbersFound = 0; 
        foreach($valueList as $value) { 
         if(in_array($value, $substring)) { 
          $countNumbersFound++; 
         } 
        } 
        if($countNumbersFound == 5) { 
         $countWins++; 
        }  
       } 
       $foundCount[$comboKey] = $countWins; 
      } 
    $bigly = max($foundCount); 


    $key = array_search($bigly, $foundCount); 

    foreach($comboList[$key] as $wellDone) { 
     echo "$wellDone ,"; 
    } 

クラスは露骨ここから盗まれた... array_count_values()が、この場合には動作しません。すべての数字の簡単な周波数でカウントしようとしている:http://www.developerfiles.com/combinations-in-php/

すべてのクラスの後オリジナルです。私は車輪を再発明することを信じていません。

+0

いいえ、私は 'array(1,2,3,4,5,7,9)'を持っていません - これが私が望むものです、望みの結果 - >私は、サブ配列...そして '$ myArray'の場合はこの組み合わせですが、それを理解する方法はわかりません。 – GilesNorthcott

+0

指導者はこのコードに満足しているはずです。特に、リスト値と値を比較するためにループする構造をクリーンアップする場合は、このコードを使用する必要があります。 – kyle

+0

これはあなたのために機能しましたか? – kyle

関連する問題