[PHP-users 11763] Re: 組合せの生成について質問

masahiro iwai php-users@php.gr.jp
Mon, 25 Nov 2002 20:03:34 +0900


ミワ 様

質問者の岩井です.ありがとうございました.
ミワ様のものを少しカスタマイズし,期待する結果を出すこ
とができました.

ミワ様をはじめ,レスを下さった皆さま誠にありがとうござ
いました.

一応,以下に書いておきます.

-----------------------------------------------------
予め,括弧による区切りを"-"に置換しています.
例.
(w3,w12,w1),(w1,w7,w13),(w5,w10),(w13)
→w3,w12,w1-w1,w7,w13-w5,w10-w13

入力ファイル"data.txt"

w3,w12,w1-w1,w7,w13-w5,w10-w13
w3,w12,w1-w1,w7,w13
w7-w4
w7-w14,w4
w8,w14,w13,w1
w3,w12,w1-w1,w7,w13-w5,w10-w13
w3,w12,w1-w1,w7,w13-w10,w11-w11
w3,w12,w1-w1,w7,w13-w10,w11-w11
w3,w12,w1-w1,w7,w13-w10,w11-w11-w6
w3,w12,w1-w1,w7,w13-w10,w11-w11-w6-w11,w5
w3,w12,w1-w1,w7,w13-w10,w11-w11-w6-w10

<?
/* ファイルを読み込みハッシュを生成 */

$filename = "data.txt";
$fcontents = file($filename);

for ($k=0; $k<count($fcontents); $k++){
 $w = split("-", $fcontents[$k]); 
 for ($i=0; $i<count($w); $i++){
  $x = split(",", $w[$i]);
  for ($j=0; $j<count($x); $j++){
   $ar[$k][$i][$j] = $x[$j];
  }
 }
}

/* 組合せを生成 */
function hoge( &$val1, &$val2 ){
 $tmp = array();
 if ( count( $val1 ) > 0 ) {
  for ( $i = 0; $i < count( $val1 ); $i++ ) {
   for ( $j = 0; $j < count( $val2 ); $j++ ) {
    $tmp[] = array_merge( $val1[$i], $val2[$j] );
   }
  }
  $val1 = $tmp;
 } else {
  $val1 = $val2;
 }
}
  
foreach($ar as $v){
 foreach( $v as $val ) { hoge( $z, $val ); }
 for($i = 0 ; $i < count($z) ; $i++){
  for($j = 0 ; $j < count($z[$i]) ; $j++){
   $myStr .= $z[$i][$j]." ";
  }
  $myStr .= "<br>";
 }
 $z = '';
}
print $myStr;
?>

On Mon, 25 Nov 2002 14:43:26 +0900
Eiji Miwa <miwa@offside.ne.jp> wrote:

> 
>  ミワです。こんにちは。
> 
> In message 「[PHP-users 11755] Re: 組合せの生成について質問」
> masahiro iwai wrote...
> 
> >(w3,w12,w1),(w1,w7,w13),(w5,w10),(w13)
> >
> >w3,w1,w5,w13
> >w3,w1,w10,w13
> >w3,w7,w5,w13
> >w3,w7,w10,w13
> >w3,w13,w5,w13
> >w3,w13,w10,w13
> >w12,w1,w5,w13
> >・・・
> >
> >のようにそれぞれの括弧から1つづつ選んだすべての組合せ
> >です.
> 
>  こんなのはどうですか?
> 
> <?php
>   
>   $x = $a = $z = array();
>   $x = array( "w3","w12","w1","w7","w13","w5","w10" );
> 
>   //(w3,w12,w1)
>   $a[0] = array( &$x[0],&$x[1],&$x[2] );
>   //(w1,w7,w13)
>   $a[1] = array( &$x[2],&$x[3],&$x[4] );
>   //(w5,w10)
>   $a[2] = array( &$x[5],&$x[6] );
>   //(w13)
>   $a[3] = array( &$x[4] );
>   
>   function hoge( &$val1, &$val2 )
>   {
>     $tmp = array();
>     if ( count( $val1 ) > 0 ) {
>       for ( $i = 0; $i < count( $val1 ); $i++ ) {
>         for ( $j = 0; $j < count( $val2 ); $j++ ) {
>           $tmp[] = array_merge( $val1[$i], $val2[$j] );
>         }
>       }
>       $val1 = $tmp;
>     } else {
>       $val1 = $val2;
>     }
>   }
>   
>   foreach( $a as $val ) { hoge( $z, $val ); }
>   print_r( $z );
>   
>   //おまけ
>   $x[1] = "w99";
>   print_r( $z );
>   
> ?>

岩井 昌弘 m-iwai@info.human.nagoya-u.ac.jp