[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