• ベストアンサー

テキストの処理について

phpを勉強中の初心者です。 テキストの処理について質問させていただきます。 あか 1 しろ 2 きいろ 3 きいろ 4 きいろ 9 あお 23 くろ 30 くろ 33 というテキストを あか 1 しろ 2 きいろ 3,4,9 あお 23 くろ 30,33 というように置換えることは可能でしょうか? よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • JaneDue
  • ベストアンサー率75% (263/350)
回答No.3

一旦配列の形にして、implode()でつなぐ方法もあります。 $lines = explode( "\n", $text); //一旦$Clolors['きいろ'] = array(3,4,9)のような配列に $Colors = array(); //全データ格納用 foreach( $lines as $line ){ list($color,$n) = explode("\t",$line); $Colors[$color][] = $n; //各色の配列ができました } //作成した配列を きいろ\t3,4,5\n の形式にして追記してゆく $text=''; foreach($Colors as $color=>$values){ $text .= "$color\t" . implode(',',$values)."\n"; } echo $text;

nyanchu
質問者

お礼

ご回答ありがとうございました。 なんとか(たぶん)理解し希望する結果を得られました。 もっと勉強したいと思います。

その他の回答 (2)

  • yuu_x
  • ベストアンサー率52% (106/202)
回答No.2

<?php  $text =<<<__TXT__ あか1 しろ2 きいろ3 きいろ4 きいろ9 あお23 くろ30 くろ33 __TXT__;    $e = mb_detect_encoding( $text );    $ary = preg_split( '/(\r\n|\n\r|\r|\n)/u', mb_convert_encoding( $text, 'UTF-8', $e ) );    $s = '';  $t = '';  foreach ( $ary as $a ) {   if ( preg_match( '/([^\d]*)(\d*)/u', $a, $m ) ) {    if ( $s != $m[1] ) {     $t .= $t != '' ? "\n" : '';     $t .= "${m[1]}${m[2]}";     $s = $m[1];    } else {     $t .= ",${m[2]}";    }   }  }    echo mb_convert_encoding( $t, $e, 'UTF-8' );

nyanchu
質問者

お礼

ご回答ありがとうございました。もっと勉強したいと思います。

  • aky_nil
  • ベストアンサー率46% (94/203)
回答No.1

意図がこれでいいのかわかりませんが、一番単純な方法は数字を変数に代入することでしょうか。 例えば「きいろ」の数字部分ですが(yellowなのでyと置きました)、 $y1 = 3; $y2 = 4; $y3 = 9; と置いて、 print "きいろ $y1"; print "きいろ $y2"; print "きいろ $y3"; print "きいろ $y1,$y2,$y3"; とすると、 きいろ 3 きいろ 4 きいろ 9 きいろ 3,4,9 と出力できます。 応用で配列を使い、 $y = array(3,4,9); print "きいろ$y[0]"; print "きいろ$y[1]"; print "きいろ$y[2]"; print "きいろ$y[0],$y[1],$y[2]"; としても同じ出力が出来ます。

nyanchu
質問者

お礼

ご回答ありがとうございます。質問がわかりにくく大変申し訳ありません。 やりたいことは取得したテキストに同じ項目があったら、一つにまとめて、数字を後ろに付け足すという処理をしたいのです。 色と数字はタブでくぎられているとして $lines = explode( "\n", $txt);//改行で区切って配列へ foreach( $lines as $value ){ $lines2[] = explode( "\t", $value); } としてからどうにかならないかと思っているのですが先にすすみません。

関連するQ&A