仕事で、出くわした仕様でした。
仕様においては、選択肢の最大が5つという事で、5個をサンプルデータとして検証しています。
おそらく、n個でも行けるはずです。
たぶん…
$patern = array( 'A' => 1, 'B' => 2, 'C' => 3, 'D' => 4, 'E' => 5, ); $keys = array_keys( $patern ); print_r( CombinationPattern::getAll( $keys ) ); //CombinationPattern::getAll( $keys ) ; exit; //==================================================================================== class CombinationPattern { function getAll( &$pattern, $flag = false ){ $ret = array(); $max = count( $pattern ); $num = $max; if( $flag ){ for( $n = 1; $n 0; $n -- ){ $list = array(); $loop = gmp_intval( gmp_fact($max) ) / ( gmp_intval( gmp_fact($n) ) * gmp_intval( gmp_fact( $max - $n ) ) ); for( $na = 0; $na = $max ) $idx -=$max; $tmp[] = $items[$idx]; $line[] = $idx; $sum *= $idx + 1; } $len = count( $line ); $loop = $max - $len; for( $nb = 0; $nb = $max ) $idx -= $max; $tmp[$len] = $items[$idx]; $swp = $sum * ($idx + 1); //debug //$line[$len] = $idx; //for( $i = 0; $i