nekogamisong7
@nekogamisong7

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

PHP forループ

解決したいこと

現在、PHPのforループの演習問題を解いているのですが、
回答を見ても理解できない部分があり、その部分の解説をして頂きたいです。

発生している問題・エラー

出題サイト
https://qiita.com/ta-k/items/5a1dd8da56e7a87ec58f

解答
https://qiita.com/ta-k/items/926f280b2119486ebce4

問題5
****1
***121
**12321
*1234321
123454321
*1234321
**12321
***121
****1

↑この問題の解答が下記の通りです。

for($a = 1 ; $a <= 9 ; $a ++){
if($a <= 5){
for($b = 4 ; $b >= $a ; $b --){
echo "";
}
for($c = 1; $c <= $a ; $c++){
echo $c;
}
for($d =$c -2 ; $d >= 1 ; $d--){
echo $d;
}
echo "
";
}
else if($a >=6 ){
for($e = 6 ; $e <= $a ; $e++){
echo "
";
}
for($f = 1 ; $f <=10-$a ; $f++){
echo $f;
}
for($g = $f-2 ; $g >=1 ; $g --){
echo $g;
}
echo "
";
}
}

※なぜか上記の解答部分の表記がおかしくなっていますが、解答のURLの問題5を見て頂ければきちんとしたコードが確認できます。

この解答の最後のfor文、
for($g = $f-2 ; $g >=1 ; $g--){
echo $g;
}

この出力がなぜ
321
21

になるのかがわかりません。

自分で試したこと

上記のコードだと、最初のループで$fは「1234」と出力するので、
$fが「3、4」の際に$gの条件式が合い、「121」が出力されてしまうのではと考えました。
つまり、else if以降のコードが実行されると

*1234121
**1231
***12
****1

になるのでは思ったのですが、実際は異なっており、$gのfor文内での$fの変化が理解できません。

どなたかご回答頂けると幸いです。

0

4Answer

これは問題5の一部を抜粋したものです。実際にどう動くかみていきましょう。

for($a = 1 ; $a <= 9 ; $a ++){
    if($a >=6 ){
        echo '$a:'.$a."\n";
        for($f = 1 ; $f <=10-$a  ; $f++){
            echo 'ループ1 $f:'.$f."\n";
        }
        echo '$f:'.$f."\n";
        echo '$g:'.($f-2)."\n";
        for($g = $f-2 ; $g >=1  ; $g --){
            echo 'ループ2 $g:'.$g."\n";
        }
        echo "\n";
    }
}

こちらが上のコードの出力結果です。

$a:6
ループ1 $f:1
ループ1 $f:2
ループ1 $f:3
ループ1 $f:4
$f:5
$g:3
ループ2 $g:3
ループ2 $g:2
ループ2 $g:1

$a:7
ループ1 $f:1
ループ1 $f:2
ループ1 $f:3
$f:4
$g:2
ループ2 $g:2
ループ2 $g:1

$a:8
ループ1 $f:1
ループ1 $f:2
$f:3
$g:1
ループ2 $g:1

$a:9
ループ1 $f:1
$f:2
$g:0

最後のループに入る時点で変数$fは5,4,3,2になります。
この変数$fの値を-2した値が変数$gなので、次のようになります。

変数$fが5:変数$gは3,2,1
変数$fが4:変数$gは2,1
変数$fが3:変数$gは1
変数$fが2:変数$gは0なのでループの中は実行されない

という動きになります。

なぜか上記の解答部分の表記がおかしくなっていますが

Qiitaの記事やコメントはMarkdownという記法なので、コードをそのまま記入すると表示がおかしくなります。
コードを正しく表示する書き方があるので参照してください。

1Like

Comments

  1. @nekogamisong7

    Questioner

    非常に丁寧なご回答ありがとうございます!
    ループの変数の変化を非常にわかりやすくまとめて頂いたおかげで理解できました...!
    どうやらループの仕組みの理解自体が自分の中で曖昧だったようです。
    それに加え、コードの書き方のリファレンスもつけて下さってありがとうございます。
    Qiita自体初めての利用でしたので、これから活用させて頂きます!

上記のコードだと、最初のループで$fは「1234」と出力するので、
$fが「3、4」の際に$gの条件式が合い、

$f が3、4のときはまだ for($f = 1 ; $f <=10-$a ; $f++){} のループが続いています。それを抜けるまで最後のループが実行されることはないため、 $g の条件式は関係してきません。

$f が4までは上記のループが実行されますが、続いて $f が5になり、ループ条件 $f <=10-$a を満たさなくなったらループから抜けます。よって最後の for 文に入る時点では $f が5になっており、解答のように出力されます。

変数の変化が理解できなければ適当な箇所で echo "($f)" などとして値を見てみるといいですよ。

1Like

なぜか上記の解答部分の表記がおかしくなっています

コードはコードブロックで囲ってみましょう

for(a=1;a=1;a <= 9 ; a ++){ 
if(a ++){ if(a <= 5){
for(b=4;b=4;b >= a;a;b --){
echo "";
}
for(c=1;c=1;c <= a;a;c++){
echo c; 
} 
for(c; } for(d =c2;c2;d >= 1 ; d--){ 
echo $d; 
} 
echo " "; 
} 
else if(d--){ echo $d; } echo " "; } else if(a >=6 ){
for(e=6;e=6;e <= a;a;e++){
echo "";
}
for(f=1;f=1;f <=10-a;a;f++){
echo f; 
} 
for(f; } for(g = f2;f2;g >=1 ; g --){ 
echog --){ echog;
}
echo "
";
}
}

image.png

1Like

Comments

  1. @nekogamisong7

    Questioner

    ご回答ありがとうございます!
    実際の入力欄の画像のおかげでコードブロックの書き方が一目瞭然です!!
    大変助かります!次回投稿時に使わせて頂きます!

簡潔かつわかりやすいご回答をありがとうございます!!
なるほど、$fがfor($f = 1 ; $f <=10-$a ; $f++){} のループを抜けてから次の式に当てはめられる、というところが今回の学びでした。
PHPを学び始めたところなので、ループの構造がそのように動いているというのがよく理解できました。
また、echo "($f)" で適当な場所で出力してみるというのも、そういう手があったか!と学習させて頂きました!あらゆる状況にて試していきたいと思います!

0Like

Your answer might help someone💌