寫來寫去, 也跟網路上找到的寫法一樣, 就順便用了他的注解嚕...
/*
* Date : 2008-06
* Name : getCombinationOutput
* Usage : Generate all combinations of the elements in the array
* Input : @param array input array contains all elements
* @param integer number of choosing
* @param string output file name
* Output : a text file contains all combination
*
* Example :
* $array = array( 684, 1056, 1066, 1274 );
* getCombinationOutput( $array, 2, "test.out" );
*
* test.out :
* 684 1056
* 684 1066
* 684 1274
* 1056 1066
* 1056 1274
* 1066 1274
*/
function getCombinationOutput( $input_array, $select, $output )
{
$_number = sizeof($input_array);
if ( !($_fp = fopen( $output, "a") ) )
{
echo "can't open file!\n\r";
return 0;
}
$_array = array();
for ( $_i=0; $_i<$select; $_i++ )
{
$_array[$_i] = $_i + 1;
}
while (1)
{
$_temp = array();
for ( $_i = 0; $_i < $select; $_i++ )
{
$_index = $_array[$_i];
fwrite ( $_fp, $input_array[$_index -1]." " );
}
fwrite ( $_fp, "\n" );
// generate next combination in lexicographical order
// start at last item
$_i = $select - 1;
// find next item to increment
while ( $_array[$_i] == ( $_number - $select + $_i + 1 ) )
{
$_i--;
}
// all done
if ( $_i < 0 )
{
break;
}
// increment
$_array[$_i] = $_array[$_i] + 1;
// do next
for ( $_j = $_i + 1; $_j < $select; $_j++ )
{
$_array[$_j] = $_array[$_i] + $_j - $_i;
}
}
fclose ( $_fp );
return $output;
}

沒有留言:
張貼留言