- ベストアンサー
PHPのループで文字を結合する方法
- PHPのループを使って文字を結合する方法について説明します。
- 例として、$zzz変数を使って文字を結合するコードを紹介します。ループ内でi回目の文字列を$zzzに結合し、最後に$zzzを出力することで結合された文字列を表示します。
- さらに、$zzz変数が初期値として空文字列を持っているため、ループ内で結合される文字列も最初から空文字列に結合されます。そのため、最初の結果は「1回目」、次の結果は「1回目2回目」という風に結合されていきます。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
もう少し具体的に変数について見ていく必要がありそうですね。 $zzz="foo"; と記載した場合、$zzzにfooという文字列が格納されます。 この時=は、代入を意味します。 では、次に以下の2行について考えてみます。 $zzz = "foo"; $zzz ="bar"; 最初は、$zzzにfooという文字列が格納されます。 次に再び$zzz ="bar"がありますが、 この意味は、$zzzの中身をfooからbarという文字列に代入し直すことを意味します。 つまり上記2行の結果、$zzzは、最初fooが入っていたが、次の=で中身がbarに変更されます。 その結果、上記2行を実行すると、$zzzには、barが格納されます。 次に以下の例について考えてみましょう。 $zzz = "foo"; $zzz .= $i."回目"; 1行目は全く同様で、$zzzにfooという文字列が格納されます。 2行目が文字結合の簡略化記法で、 $zzz = $zzz. $i . "回目"; と全く同じ意味になります。 この時左辺と右辺に$zzzがありますが、右辺から処理していきます。 つまり、現在$zzzには、fooが入っているため、($iにも1が入っているので合わせて展開) $zzz = "foo". 1. "回目"; 右辺を文字結合すると以下のようになります。 $zzz = "foo1回目"; これは、$zzz = "foo";と全く同じ、$zzzへの代入式になります。 つまり、$zzzには"foo1回目"という文字列が新たに格納されるようになります。 whileでは、$iを加算し、以下の行が再び実行されます。 $zzz .= $i . "回目"; whileの1回目で、$zzzは、"foo1回目"に置き換わっています。 $zzz .= $i . "回目"; ↓ $zzz = $zzz. $i . "回目"; ↓ $zzz = "foo1回目". 2 . "回目"; ↓ $zzz = "foo1回目2回目"; このように変化し、2回目のループで、$zzzの値は、"foo1回目2回目"に置き換わります。
その他の回答 (4)
- nekomikekamo
- ベストアンサー率73% (71/97)
動きとしては以下の通りです。 //初期値 $zzz = "ooo"; // ooo とする。 //結合部分 $zzz .= "1回目"; これは、以下の意味と同じになる。 $zzz = $zzz . "1回目" つまり、右側が文字結合(.は結合の意味。)され以下の通りとなる。 $zzz = "ooo" . "1回目"//右辺の$zzzをoooに置き換え。 $zzz = "ooo1回目" //右辺の結合後の結果 次に、2回目の文字を結合する事を考えてみる。 $zzz .= "2回目" これも同様に展開してみる。 $zzz = $zzz . "2回目" この場合、$zzz= "ooo1回目"なので、以下のようになる。 $zzz = "ooo1回目". "2回目"//右辺の$zzzをooo1回目に置き換え。 これも、右側が文字結合され以下の通り。 $zzz = "ooo1回目2回目"
補足
説明ありがとうございます。 まだはっきりは理解できていないのですが while(条件)の{}の中で繰り返して処理されているのは 「.= $i."回目";」の部分だけで $zzzの値自体は何も処理されず値は変わず 「.= $i."回目";」部分が繋ぎ足され 条件をオーバーした6回で echoに移って出力されるということなのでしょうか? もしそうであれば最初から$zzzに値をいれず シンプルに以下のようにしてもよいような気がするのですが このサンプルの意味自体を理解していないのかもしれません。 ---------------------------------------- $i = 1; while ($i <= 5) { echo $i."回目"; $i++; } でもこれだとループでの文字結合の意味がないのですね。 ---------------------------------------- $i = 1; while ($i <= 5) { $zzz .= $i."回目"; $i++; } echo $zzz; こうすると多少理解しやすくはなるのですが 何か違うような気もします。
ちょっと混乱しちゃっていますね。 $zzz .= $i . "回目"; これは $zzz = $zzz . $i . "回目"; の省略であることは分かりますよね?しかし、こうではありません。 (質問者さんが引っ掛かっているのは恐らく↓のコードの動作でしょう。) $zzz .= $zzz . $i . "回目"; この考えだと無限にループしそうな感じですねw $zzz .= $zzz . $i . "回目"; $zzz = $zzz . $zzz . $i . "回目"; $zzz .= $zzz . $zzz . $i . "回目"; $zzz = $zzz . $zzz. $zzz. $i . "回目"; … あまり難しく考えずに、 「.=」 … 右の値を文字列としてを左にくっつける 「.+」 … 右の値を数字として左に加える ぐらいでいいと思います。そのうち自然に慣れてくるでしょう。
お礼
分かりやすい説明ありがとうございました!
- LancerVII
- ベストアンサー率51% (1060/2054)
>(1) > >$i = 1; >$zzz = ""; > >--------------------------- >(2) >while ($i <= 5) { >$zzz .= $i."回目"; >$i++; >} > >------------------------- >(3) > >echo $zzz; > >(1)部分の$zzzは(2)に入った以降はもう存在せず無視していいと考え 基本的には上から下へ流れていくので、無視には語弊があると思います。 1の部分は初期化です。 $iは1、$zzzは空文字にするという初期化です。 >(2)部分の$zzzの流れだけを考え >$iが5になったときの全ての結果「1回目2回目3回目・・・」が 2の部分を読み解くと $iが5以下の間はループを継続します。 そのループの中身は $zzzに対して$i."回目"という文字を追加していきます。 >(3)のechoで値が表示されると考えるのでしょうか? そうですね。 $iが6になったらループが終了します。 そのときの文字列は1回目2回目3回目・・・となります。 > >1回目のループで$zzzの値は「””1回目」となり、 >2回目のループでは自動的に「””1回目.=$2.”回目”」という式になり >値は「””1回目””2回目」になると考えてしまうのですが・・・ $zzz = ""; 多くのプログラム言語では"(ダブルクォーテーション)で囲うと文字列として認識します。 よって上記の場合は空文字となります。 zzzの中身に"は入りません。"記号から"記号の間にあるものが文字列となります。 なので間に文字が無いので空文字です。 例えば半角の空白で初期化するなら $zzz = " "; 全角の空白なら $zzza = " "; あくまで、"に囲まれたものが文字になります。
お礼
理解はまだできていないのですが 色々サンプルのパターンを丸暗記しながら どんどん数をこなし いつか理解できるまでがんばろうと思います。 ありがとうございました。
補足
丁寧な回答感謝しています。 --------------------------- (2) while ($i <= 5) { $zzz .= $i."回目"; (これに書き換えられると思うのですが→$zzz = $zzz.$i."回目";) $i++; } --------------------------- (2)で$zzzにはいった値、仮に「ooo」であれば この$zzzの「ooo」はwhileでループされている間は処理されずそのままで 「$i."回目"」だけが5回繰り返されるという認識でしょうか? arrayなど配列とかも関係しているのかなとか 考えれば考えるほど分からなくなってきます。 ぼんやりと答えが見つかりそうな感覚はありますが 初心者は深いことを考えず、こういうパターンとして そのまま構図を丸暗記して いつか勉強していくうちに理解できるようになるのでしょうか・・・
- LancerVII
- ベストアンサー率51% (1060/2054)
こんにちは。 以下の""の中身はzzzの中身を表します "" "1回目" ( ""+"1回目") "1回目2回目" ("1回目"+"2回目") と増えていきます。 前の変数の状態に文字が結合されていくイメージです。 なので 初期化時に"ooo"とした場合は "ooo" "ooo1回目" ( "ooo"+"1回目") "ooo1回目2回目" ("ooo1回目"+"2回目") となります。 最初のzzzの中身が常に結合されていくのではなく、 あくまで、前の状態に結合されていきます。
補足
早速のご返答ありがとうございます! 今一生懸命考えているのですが やはり理解ができません。 (1) $i = 1; $zzz = ""; --------------------------- (2) while ($i <= 5) { $zzz .= $i."回目"; $i++; } ------------------------- (3) echo $zzz; (1)部分の$zzzは(2)に入った以降はもう存在せず無視していいと考え (2)部分の$zzzの流れだけを考え $iが5になったときの全ての結果「1回目2回目3回目・・・」が (3)のechoで値が表示されると考えるのでしょうか? 1回目のループで$zzzの値は「””1回目」となり、 2回目のループでは自動的に「””1回目.=$2.”回目”」という式になり 値は「””1回目””2回目」になると考えてしまうのですが・・・
お礼
まだよく理解はできていないのですが この問題に固執せず、先に進み いつか理解できるまでがんばろうと思います。 分かりやすい解説ありがとうございました!!