質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • PHP

    20912questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • if

    212questions

    if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

PHP:if文をif-else文にしたいが、波括弧をつけると何も表示されなくなる

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 1,347

igaiga

score 114

お世話になります。
PHP勉強中ですが、独学のため行き詰まってしまいました。
アドバイス、ヒント頂ければ幸いです。

発生している問題・エラーメッセージ

作成済みのソースコードをif文からif-else文に変更したく思います。
以下のようにしてみましたがエラーなどでうまく動作しません。

該当のソースコード

<?php
                foreach( $attachments as $id => $attachment ):
                    if( get_post_thumbnail_id($post->ID) == $attachment->ID ) 
                    continue;
                    echo '<div class="img">';
                    echo wp_get_attachment_image($id, "thumb_300", false);
                    echo '</div>';
                endforeach;
?>

これを↓この様のしましたが「Parse error: syntax error, unexpected 'endif' (T_ENDIF) in~」となってしまいます

<?php
    foreach( $attachments as $id => $attachment ):
        if( get_post_thumbnail_id($post->ID) == $attachment->ID ) {
                    continue;
                    echo '<div class="img">';
                    echo wp_get_attachment_image($id, "thumb_300", false);
                    echo '</div>';}
        else {echo "失敗";}
        endif;
    endforeach;
?>

また以下のように試しにelse {echo "失敗";}やendif;を削除すると今度はこの部分(画像が入ります)が何も表示されなくなります。

<?php
    foreach( $attachments as $id => $attachment ):
        if( get_post_thumbnail_id($post->ID) == $attachment->ID ) {
                    continue;
                    echo '<div class="img">';
                    echo wp_get_attachment_image($id, "thumb_300", false);
                    echo '</div>';}
    endforeach;
?>

初心者なので何か基本的なことを見落としているのではないかとも思いますが、
お知恵を拝借できれば幸いです。

よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+4

まず、正しく動いていた処理を分かりやすい様に{}で囲んで纏めてみます。

{:と同じ意味で、
}end*****;などの処理と同じ意味です。

foreach( $attachments as $id => $attachment ){
    if( get_post_thumbnail_id($post->ID) == $attachment->ID ){
        continue;
    }
    echo '<div class="img">';
    echo wp_get_attachment_image($id, "thumb_300", false);
    echo '</div>';
}

if文の後に{:が無い場合、
その次の;までの処理がif文がtrueだった場合に実行されます。
またcontinue;を使うと、それ以降のforeachの処理を省略して、次のループへと進みます。

ですので、上記のコードにエラーはありませんが、
get_post_thumbnail_id($post->ID) == $attachment->IDがfalseだった時のみ、
画像が表示されるという、恐らく想定していない動きになっている様に見えました。

という前提で、改めて問題のコードを見てみます。

foreach( $attachments as $id => $attachment ):
        if( get_post_thumbnail_id($post->ID) == $attachment->ID ) {
                    continue;
                    echo '<div class="img">';
                    echo wp_get_attachment_image($id, "thumb_300", false);
                    echo '</div>';}
        else {echo "失敗";}
        endif;
    endforeach;

まず、if文などの括りを{}に直します。
また}があるにも関わらず、同じ意味のendif;があるのはおかしいので修正します。

foreach( $attachments as $id => $attachment ){
    if( get_post_thumbnail_id($post->ID) == $attachment->ID ) {
        continue;
        echo '<div class="img">';
        echo wp_get_attachment_image($id, "thumb_300", false);
        echo '</div>';
    }else{
        echo "失敗";
    }
}

しかし、このままだと画像を表示する処理よりも前にcontinue;があります。
ですので、get_post_thumbnail_id($post->ID) == $attachment->IDがfalseの時のみ
失敗と表示される良く分からない内容になってしまっています。

なので順番を見なおして、以下の様にすると上手く行くかと思うのですがいかがでしょうか。

foreach( $attachments as $id => $attachment ){
    if( get_post_thumbnail_id($post->ID) == $attachment->ID ) {
        echo '<div class="img">';
        echo wp_get_attachment_image($id, "thumb_300", false);
        echo '</div>';
        continue;
    }else{
        echo "失敗";
    }
}

もっといえば、continue;の後に省略すべきコードがない為、以下でも大丈夫です。
(ifがtrueであればelseの内容は無視されます)

foreach( $attachments as $id => $attachment ){
    if( get_post_thumbnail_id($post->ID) == $attachment->ID ) {
        echo '<div class="img">';
        echo wp_get_attachment_image($id, "thumb_300", false);
        echo '</div>';
    }else{
        echo "失敗";
    }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/11 17:40

    ありがとうございます!いろいろ根本的に間違ってたってことですね。。。
    想定通りに動作するようになりました。
    丁寧なご指導非常に助かりました。今後とも宜しくお願いします。

    キャンセル

  • 2016/05/11 17:47

    少しでも参考になった様でしたら、よかったです。
    頑張ってください!

    キャンセル

0

<?php
    foreach( $attachments as $id => $attachment ):
        if( get_post_thumbnail_id($post->ID) == $attachment->ID ) {
                    continue;
                    echo '<div class="img">';
                    echo wp_get_attachment_image($id, "thumb_300", false);
                    echo '</div>';}
        else {echo "失敗";}
        endif; // <= これおかしいじゃん
    endforeach;
?>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/11 17:15

    ありがとうございます!
    endif; を消してみたところ、失敗と表示されるようになりました。
    でも変更前までは画像が表示されていたので( get_post_thumbnail_id($post->ID) == $attachment->ID ) がおかしいんですかね。。。
    ちょっと前進しました。ありがとうございました。

    キャンセル

0

<?php
    foreach( $attachments as $id => $attachment ):
        if( get_post_thumbnail_id($post->ID) == $attachment->ID ) {
                    continue;
                    echo '<div class="img">';
                    echo wp_get_attachment_image($id, "thumb_300", false);
                    echo '</div>';}
    endforeach;
?>

これの場合ifの条件が成立すると{}内の一番最初がcontinueなので
何もせずに次のループになります
ifが成立しない場合は{}の外に何もないので何もしないので
何もせずに次のループになります

どうしたいのかがわからないのでどう直すべきかはわかりませんが、
とりあえずcontinue;を消せばifが成立した時に画像が表示されるはずです

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/11 17:40

    ありがとうございます

    キャンセル

0

まず、continue;はループ(foreach)から抜ける、という処理なので、
continue;の後にechoなどの処理をしても表示はされません。

また、普通のif文の場合、endifは必要ありません。
if文の基本の記述は下記のようになります。
波括弧の位置などをしっかり確認して下さい。

foreachも同様、endforeachは不要です。

//ifの場合
<?php
if (条件) {
   //該当の処理
   echo '<div class="img">';
   echo wp_get_attachment_image($id, "thumb_300", false);
   echo '</div>';
} else {
   //該当しなかった場合の処理
   echo "失敗";
}
?>

//foreachの場合
<?php
 foreach ($hoge as $foo) {
   //処理
}

合わせると
<?php
 foreach($hoge as $foo){
    if(条件){
     //処理
   }else{
     //処理//ifの終わり
}//foreachの終わり
これでよいです。



もし、HTMLの中にPHPを書いている、と言った場合はendif、endforeachが必要です。
ifとelse、foreachの後ろは:
endifやendforeachの後ろは;
で違うので注意して下さい。
下記の場合、HTMLはそのまま書けばOKです。PHPの処理は<?php  ?>で囲みます。

<h1>例えば</h1>

<?php foreach($hoge as $foo): ?>
<?pho if (条件): ?>
   <div class="img">
   <?php echo wp_get_attachment_image($id, "thumb_300", false); ?>
   </div>
<?php else: ?>
   <p>失敗です</p>
   <?php echo '失敗です' ; ?>
<?php endif; >
<?php endforeach; ?>

まとめますと

記述頂いているコードですが、PHPのファイルに書いているとすれば、

<?php
foreach( $attachments as $id => $attachment ) {
   if ( get_post_thumbnail_id($post->ID) == $attachment->ID ) {
     echo '<div class="img">';
     echo wp_get_attachment_image($id, "thumb_300", false);
     echo '</div>';
   } else {
     echo "失敗";
   } //ifの終わり
}//foreachの終わり

これでコンティニューしなくても、ifの条件に該当すれば画像のecho処理をして次の$idに進みます。
該当しない場合は、失敗と表示されて次の$idに進みます。
?>



HTML内に書いている場合は、下記の様になります。

<?php foreach( $attachments as $id => $attachment ): ?>
   <?php if ( get_post_thumbnail_id($post->ID) == $attachment->ID ): ?>
     <div class="img">
     <?php echo wp_get_attachment_image($id, "thumb_300", false); ?>
     </div>
<?php else: ?>
     <?php echo "失敗"; ?>
<?php endif; ?>
<?php endforeach; ?>

HTMLタグはechoせず普通に書きます。
HTMLファイルにPHPを組み込んでる場合はこれでOKです。

なぜコンティニューしているのかが、ちょっとわからなかったのですが、力になれましたら幸いです。
まずifとforeachの書き方をしっかり確認して下さい。書き方がごちゃごちゃになってしまってます!
長くなってしまってすみません;;;

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/11 17:54

    ありがとうございます。
    解決いたしました。continue;は意味も理解せずコピペしてたみたいです。。。
    すみません。

    キャンセル

関連した質問

同じタグがついた質問を見る

  • PHP

    20912questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • if

    212questions

    if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。