• ベストアンサー

文字列の並び替え

お世話になっております。 以下、ご指導いただければ幸いです。 カンマで区切られた以下のような文字列があります。 $txt = "佐藤,武田,斉藤,鈴木,内田"; この変数txt内にある文字列を、「武田」と「斉藤」を入れ替えたい(並び替え)と思うのですが、どのようにすれば宜しいでしょうか? (隣り合わせのデータのみの並び替えです) ※並び返したい命令?は、順番の番号にて取得出来る状態です。 (この例の場合で言ったら、「1と2」という感じです) 現在、 $txt_array = explode(",", $txt); などとして、一旦配列にして、for文で繰り返し処理を行いながら、武田と斉藤をそれぞれ別の変数に格納し・・・などと考えていますが、とても非効率のような気がするものの、他の策が見えて来ずに困っています。 以上、お恥ずかしい質問かと思いますが、アドバイスなど頂戴出来れば幸いです。 お忙しいなか恐縮ですが宜しくお願いいたします。

  • PHP
  • 回答数4
  • ありがとう数7

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

  • ベストアンサー
  • BellBell
  • ベストアンサー率54% (327/598)
回答No.4

>データを入れ替えた配列($txt_array)を$txtのように戻す?には、どのようなスクリプトが考えられるのでしょうか? explodeと対になる関数として、implodeがあります。 なので、以下の一行でOK $txt = implode(",", $txt_array); 元データが判らないので何とも言えませんが、#1さんの方法は入れ替えたい対象の『武田』もしくは『斉藤』が複数あった場合にちょっと気になります。 元データで、同一名称がないことが保証されているとか、山田、小山田、などのデータがないとか。

a4_chapp
質問者

お礼

BellBell様 お世話になっております。 implode・・・そうでした! explodeを使っているわけですから、それくらい気づかなくては・・お恥ずかしい。汗 >入れ替えたい対象の『武田』もしくは『斉藤』が複数あった場合にちょっと気になります。 仰る通りですね。重複したデータは存在しない作りになっているので問題ないと考えていましたが、 >山田、小山田、などのデータがないとか。 このような場合も変換されてしまいますもんね。ご指摘ありがとうございます!

その他の回答 (3)

  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.3

既に #1さんの方法で 解決しちゃったみたいですけど、str_replace()使うなら strtr() も検討してみてください。

参考URL:
http://php.net/manual/ja/function.strtr.php
a4_chapp
質問者

補足

bm_hiro様 こんばんは。 #2様へのお礼でもお伝えしましたが、“解決済み”としたつもりが、そのままになっていました。 ご親切な対応、感謝申し上げます。ありがとうございました。

  • BellBell
  • ベストアンサー率54% (327/598)
回答No.2

>※並び返したい命令?は、順番の番号にて取得出来る状態です。 並び替えしたい命令ですね。 この状態であれば、事実上配列に変換してからでないと逆に非効率になると思います。 ただ、 >for文で繰り返し処理を行いながら と、なぜfor分を使わなければならないかが疑問ではあります。 武田,斉藤の入れ替えが、1,2という指定でくると言うことは、素直にPHPの配列のIndexとして使えますね。 (※佐藤=0ですね) で、質問内にあった例から利用すると $txt_array = explode(",", $txt); 入れ替え指示は$a,$bという引数に格納されているとして、下記で、入れ替えは完了でfor文は不要です。 $swap=$txt_array[$a]; $txt_array[$a] = $txt_array[$b]; $txt_array[$b] = $swap; Aの値を一時的に他の変数(スワップ変数という場合があります=入れ替えの為にちょっと値を入れておく変数)に放り込んで AにBを上書き Bに保存しておいたAを上書き 以上です。 実際には、$a,$bが共にマイナスでないこと、$a,$bが共に$txt_arrayの配列の数(count($txt_array))以下になること。 さらに言えば、$a==$bではない事。 それらのエラーチェックを入れる必要があるかも知れません。

a4_chapp
質問者

お礼

BellBell様 ご親切な対応をありがとうございます。 “解決済み”としたつもりでしたが、そのままになっていました。 >$swap=$txt_array[$a]; >$txt_array[$a] = $txt_array[$b]; >$txt_array[$b] = $swap; この発想、全く出てきませんでした!勉強になりました! そもそも、for文を使って・・と申したのも、文字列を入れ替えるために$txtにある文字列を配列に変換?し、array_splice()を使う事で入れ替えられると考えてはいたのですが、上記のようなやり方で出来るのですね。凄くためになります。 今一度お伺いしたいのですが、先にも申し上げたように、そもそも$txtは,で区切られた文字列なので、データを入れ替えた後、$txtと同じように、,で区切られた形式で残したいのですが、今回アドバイスいただいた内容を例とすると、データを入れ替えた配列($txt_array)を$txtのように戻す?には、どのようなスクリプトが考えられるのでしょうか? お恥ずかしいながら、私のスキルでは、またfor文にて繰り返し処理を行いながら、 $txt.=$txt_array[$i]; という流れしか思いつきません。 これだと、データの入れ替えまではとても良いのですが、スクリプト自体もスマート(長いスクリプトになってしまう)じゃないため、どうしたものかと悩んでしまいます。 お忙しいなか恐縮ですが、今一度アドバイスのほど頂戴できれば幸いです。

  • chuchuo
  • ベストアンサー率45% (99/217)
回答No.1

str_replaceを用いて両方の文字を入れ替えるのがスマートでしょうか? ただし、「武田」と「斉藤」を入れ替える場合は 一度、「武田」を「●●」という適当な文字にいったん変えて 次に、「斉藤」を、「武田」に置き換え さらに前の「●●」を「斉藤」に置き換えます。 そうしないと、最初にいきなり「武田」を「斉藤」へ入れ替えると 次に「斉藤」を入れ替える際に両方が「武田」へ置き換わちゃいます。(^_^.)

参考URL:
http://www.phppro.jp/phpmanual/php/function.str-replace.html
a4_chapp
質問者

お礼

chuchuo様 こんにちは。早速の対応をありがとうございます! >次に「斉藤」を入れ替える際に両方が「武田」へ置き換わちゃいます。(^_^.) そうなんですよね(^_^;; そう思って考えていたら、for文で・・なんて考えてしまいましたが、str_replace()を利用することでスマートに記述することが出来ました!(お恥ずかしい事になかなか機転が利きません) ありがとうございました!

関連するQ&A

  • エクセル セル内の重複する文字列を削除する方法

    エクセルでセル内の重複する文字列を削除する方法を教えてください。 例えばA1のセルに次のような文字列があります 斎藤(18) 武田(21) 稲葉(41) 田中(3) 斎藤(18) 金子(8) 田中(3) この中で重複している文字列(斎藤(18)田中(3))を削除し、以下のようにしたいと思います。 斎藤(18) 武田(21) 稲葉(41) 田中(3) 金子(8) 区切り位置にはカンマやスペースは入ってません。 (改行コードは入ってます) わかる方おられましたら教えていただけますと幸いです。 よろしくお願いいたします。

  • 正規表現を使った文字列の抽出方法について

    正規表現を使った文字列の抽出方法について RHELを使っています。 テキストデータの中に、以下のようなデータが 百万行単位で並んでいます。(カンマ区切り、2列構成) 1, 1.24425 2, 3.25252 (中略) 13, 6.25365 14, 8,36222 (中略) 103633, 252525.0 最終的にやりたいことは2列目のデータのみの抽出です。 考え方として、正規表現で 「<任意の文字列の連続><カンマ>」という文字列を認識させ、 それを「空欄」で置換したいと考えています。 文字列の最後の文字をマッチさせる指定子が「$」という情報をWebで見つけたので まず、grepで見つけられるか以下のようにやってみたのですが、 grep -i ",$" test.txt $が環境変数と取られ、構文エラーとなってしまいます。 使い方がおかしいのでしょうか? ちなみに、うすうす感じている疑問として、「$」は文末にくるものしかマッチしなかったり しますでしょうか? カンマ区切りなので、表計算ソフトを使えなくもないですが、 行数がExcel2007の限界をよく超えるので、それ以外の方法で考えています。 アドバイスよろしくお願いいたします。

  • vba 文字列の並び替え

    こんにちは! VBAにて以下の処理をしたいのですがどうやっても上手くいかず悩んでます。 A列には文字列B列には数字が入っています。 B列を昇順で並び替えし且つA列に指定した文字列がある場合先頭にデータを昇順で持ってくる。 ※B列で並び替えたあとにif構文で切り取り→挿入を試みたのですがどうしても昇順にならず 泣 どうかご教授下さい(ToT) 宜しくお願い致します。 A B EEEE 1 EEEE 2 RRRR 3 RRRR 4 FFFF 5 DDDD 6 上記の状態からRRRRを先頭に持っていき昇順で並び替えする。

  • fgetsで取り込んだ文字をexplodeで配列にしたい

    こんにちは PHPの勉強を始めたばかりです。 あまり関数もたくさん知りませんが、今のところ覚えたもので、外部ファイル(TXTファイル)から文字列を引っ張り出して、スケジュール表を生成するPHPを作りたいと考えています。 カンマで区切られた文字列を格納したdata.txtというファイルがあります。 内容は 開催月,開催日,時間帯,定員,応募締切月,応募締切日 で、データとしては 6,10,AM,12,5,30 という感じで格納されています。 以下まで作ってみました。 <?php //data.txtの読み込み $rData = fopen('data.txt','r');//data.txtを読み込み専用で開き、変数rDataで扱えるようにする $i = 0; while(!feof($rData)){//eof(ファイルの終端)でない限り続ける繰り返し処理 $DataLine = fgets($rData);//1行を取り出し、変数DataLineに格納する $DataLine.$i = explode(",",$DataLine);//DataLineに格納した文字列をカンマで分割してDataLine0やDataLine1などの配列に格納 $i ++; } fclose($rData);//開いていたファイルを閉じる ?> <html> <head> <title></title> </head> <body> <?php echo $DataLine0[0]; ?> </body> </html> data.txtの1行目には、 6,10,AM,12,5,30 という文字列が入っています。 ですので、自分としてはこの処理で1行目のはじめの文字である「6」が表示されると思い込んでいたのですが、できませんでした。 画面には何も表示されません。特にエラーも表示されませんでした。 この処理の方法は何か間違っているのでしょうか。 お分かりになる方、いらっしゃいましたら、お力添えいただければ幸いです。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 文字列を配列定義に使用するには

    文字列を配列の定義に使用したいのですが、可能でしょうか? 具体的には以下のような内容です。  $AAA = array("name"=>"山田","val"=>"10"); とすると変数$AAAは配列になります。  $BBB = 'array("name"=>"佐藤","val"=>"20")'; とすると変数$BBBは文字列になります。  $CCC = $BBB; と変数$CCCに代入した場合に、 変数$CCCを配列として認識させたいです。 つまり  print $CCC[name]; //佐藤  print $CCC[val]; //20 というように出力させたいのですが、 根本的に可能なのでしょうか…? よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • アスタリスクを文字列として変数に入れるには

    HP-UX cshで、アスタリスクを文字列として 変数に入れるにはどうしたら良いでしょうか? 現在は <file3の中身> grep -v file*.txt | grep -v file2.txt で、 set hensu=`cat file3.txt`としてecho $hensuすると grep -v file1.txt file2.txt file3.txt | grep -v file2.txt という具合に、アスタリスクがワイルドカードとして 働きます。これを「file*.txt」という文字列として 変数に入れる方法を教えてください。 宜しくお願いします。

  • 文字列に含まれている「,」をカウントする

    PHP4.x.xです。 初心者です。 以下のような文字列の「,」も数を数えたいのですが、どうしたらいいいでしょうか? 以下のような文字列です。 田中,佐藤,鈴木,前田 どうぞアドバイスよろしくお願いします!!

    • ベストアンサー
    • PHP
  • CString型の文字列連結について

    質問させて頂きます。 開発環境はVC++.netです。 CString型の文字列連結について教えて頂きたく。 CString Test[_MAX_FNAME+1]; という変数にがあるとします。 Test変数のデータは Test[0]には"2" Test[1]には"1" が格納されてるとします。 Test変数のデータをCString Text1という変数に 以下のようなソースで文字列連結処理を行ったのですが、だめでした。 何がいけないのでしょうか? for(int i = 0; i <= 2; i++) { Text1 += Test[i]; } 実行結果は Text1には"2"が格納されたままでした。 実際はText1には、"2""1"となってほしい。 分かりにくい説明とは思いますが、 回答、ヒントなどを頂けますでしょうか 宜しくお願い致します。 それと、もしよかったら、Text1の格納データは "2","1"としたいので、カンマ区切りのやりかたなども ヒントを頂けたら幸いです。 以上です。 宜しくお願い致します。

  • 並び替え!

    テキストから文字列を読み込んでそれをならびかえる処理を したいのですが どうやったらよいか つまってしまいまして 質問させていただきました。 <テキストの内容> あいうえお さしすせそ おおお ききき しし     (テキストにはひらがなが 入っています) これを読み込んで50音順にしてあげたいのですが。 エクセルの並び替えだと あっというまにできてしまうじゃないですか VBには おなじような機能はないのでしょうか? 配列?RECORDSET? 完全につまってしまいました よろしくおねがいいたします

  • 文字の並び替え

    今、全角文字と半角文字が混在した文字列の並び替えをしています。 また、皆様のお力をおかしください。 例:CBABD → ABBCD 色々調べて以下の関数を使うことはわかったのですが、これをどう使えば、並び替えることが出来るのかがわかりません。教えてください。 例があれば、とてもうれしいのですが・・・ int ZenkakuHantei(unsigned char c) { return (((c >= 0x81) && (c <= 0x9f)) || ((c >= 0xe0) && (c <= 0xfc))); }

専門家に質問してみよう