- ベストアンサー
文字列の並び替え
お世話になっております。 以下、ご指導いただければ幸いです。 カンマで区切られた以下のような文字列があります。 $txt = "佐藤,武田,斉藤,鈴木,内田"; この変数txt内にある文字列を、「武田」と「斉藤」を入れ替えたい(並び替え)と思うのですが、どのようにすれば宜しいでしょうか? (隣り合わせのデータのみの並び替えです) ※並び返したい命令?は、順番の番号にて取得出来る状態です。 (この例の場合で言ったら、「1と2」という感じです) 現在、 $txt_array = explode(",", $txt); などとして、一旦配列にして、for文で繰り返し処理を行いながら、武田と斉藤をそれぞれ別の変数に格納し・・・などと考えていますが、とても非効率のような気がするものの、他の策が見えて来ずに困っています。 以上、お恥ずかしい質問かと思いますが、アドバイスなど頂戴出来れば幸いです。 お忙しいなか恐縮ですが宜しくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>データを入れ替えた配列($txt_array)を$txtのように戻す?には、どのようなスクリプトが考えられるのでしょうか? explodeと対になる関数として、implodeがあります。 なので、以下の一行でOK $txt = implode(",", $txt_array); 元データが判らないので何とも言えませんが、#1さんの方法は入れ替えたい対象の『武田』もしくは『斉藤』が複数あった場合にちょっと気になります。 元データで、同一名称がないことが保証されているとか、山田、小山田、などのデータがないとか。
その他の回答 (3)
- bm_hiro
- ベストアンサー率51% (200/388)
既に #1さんの方法で 解決しちゃったみたいですけど、str_replace()使うなら strtr() も検討してみてください。
補足
bm_hiro様 こんばんは。 #2様へのお礼でもお伝えしましたが、“解決済み”としたつもりが、そのままになっていました。 ご親切な対応、感謝申し上げます。ありがとうございました。
- BellBell
- ベストアンサー率54% (327/598)
>※並び返したい命令?は、順番の番号にて取得出来る状態です。 並び替えしたい命令ですね。 この状態であれば、事実上配列に変換してからでないと逆に非効率になると思います。 ただ、 >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ではない事。 それらのエラーチェックを入れる必要があるかも知れません。
お礼
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)
str_replaceを用いて両方の文字を入れ替えるのがスマートでしょうか? ただし、「武田」と「斉藤」を入れ替える場合は 一度、「武田」を「●●」という適当な文字にいったん変えて 次に、「斉藤」を、「武田」に置き換え さらに前の「●●」を「斉藤」に置き換えます。 そうしないと、最初にいきなり「武田」を「斉藤」へ入れ替えると 次に「斉藤」を入れ替える際に両方が「武田」へ置き換わちゃいます。(^_^.)
お礼
chuchuo様 こんにちは。早速の対応をありがとうございます! >次に「斉藤」を入れ替える際に両方が「武田」へ置き換わちゃいます。(^_^.) そうなんですよね(^_^;; そう思って考えていたら、for文で・・なんて考えてしまいましたが、str_replace()を利用することでスマートに記述することが出来ました!(お恥ずかしい事になかなか機転が利きません) ありがとうございました!
お礼
BellBell様 お世話になっております。 implode・・・そうでした! explodeを使っているわけですから、それくらい気づかなくては・・お恥ずかしい。汗 >入れ替えたい対象の『武田』もしくは『斉藤』が複数あった場合にちょっと気になります。 仰る通りですね。重複したデータは存在しない作りになっているので問題ないと考えていましたが、 >山田、小山田、などのデータがないとか。 このような場合も変換されてしまいますもんね。ご指摘ありがとうございます!