Finding all non-conflicting combinations of values from multiple lists of values

前端 未结 9 1044
没有蜡笔的小新
没有蜡笔的小新 2021-01-01 05:34

I have the following array which contains arrays of values:

$array = array(
    array(\'1\', \'2\'),
    array(\'a\', \'b\', \'c\'),
    array(\'x\', \'y\'),         


        
9条回答
  •  猫巷女王i
    2021-01-01 05:56

    Look at it from a different angle: in order to compose a result row, you need to pick a value for each column. Each value should be picked from a different source row. The problem is know as "pick N out of M", or more mathematically, a Combination.

    This means that a result row corresponds to an array of source-row indices.

    You can build all possible pickings by starting to build an index-array like this (pseudo-code)

    function combinations( $source ) {
      if( count( $source ) == 0 ) return $source;
      $result=array();
      // build one row
      foreach( $source as $index=>$value ) {
        $newsource = array_splice( $source, $index, 1 );
    
        $reduced_combinations=combinations( $newsource  );
        foreach( $reduced_combinations as $reduced_combi ) {
          $newrow=array_unshift( $reduced_combi, $value );
          $result[]=$newrow;
        }
    
      }
      return $result;
    }
    
    function retrieve_indices( $indices, $arrays ) {
       $result=array();
       foreach( $indices as $column=>$index ) {
         $result[]=$arrays[$index][$column];
       }
       return $result;
    }
    
    $source_arrays = array(
      array( "1", "2", "3" ),
      array( "a", "b", "c" ),
      array( "x", "y", "z" )
    );
    
    $index_combinations = combinations( range(0,2) );
    $result=array();
    foreach( $index_combinations as $combination ) {
      $result[]=retrieve_indices( $combination, $source_arrays );
    }
    

提交回复
热议问题