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

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

新規登録して質問してみよう
ただいま回答率
85.48%
if

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

PHP

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

Q&A

解決済

4回答

3934閲覧

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

igaiga

総合スコア144

if

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

PHP

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

1グッド

0クリップ

投稿2016/05/11 07:59

お世話になります。
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; ?>

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

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

poyopi👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

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

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

php

1foreach( $attachments as $id => $attachment ){ 2 if( get_post_thumbnail_id($post->ID) == $attachment->ID ){ 3 continue; 4 } 5 echo '<div class="img">'; 6 echo wp_get_attachment_image($id, "thumb_300", false); 7 echo '</div>'; 8}

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

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

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

php

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

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

php

1foreach( $attachments as $id => $attachment ){ 2 if( get_post_thumbnail_id($post->ID) == $attachment->ID ) { 3 continue; 4 echo '<div class="img">'; 5 echo wp_get_attachment_image($id, "thumb_300", false); 6 echo '</div>'; 7 }else{ 8 echo "失敗"; 9 } 10}

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

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

php

1foreach( $attachments as $id => $attachment ){ 2 if( get_post_thumbnail_id($post->ID) == $attachment->ID ) { 3 echo '<div class="img">'; 4 echo wp_get_attachment_image($id, "thumb_300", false); 5 echo '</div>'; 6 continue; 7 }else{ 8 echo "失敗"; 9 } 10}

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

php

1foreach( $attachments as $id => $attachment ){ 2 if( get_post_thumbnail_id($post->ID) == $attachment->ID ) { 3 echo '<div class="img">'; 4 echo wp_get_attachment_image($id, "thumb_300", false); 5 echo '</div>'; 6 }else{ 7 echo "失敗"; 8 } 9}

投稿2016/05/11 08:12

編集2016/05/11 08:14
gzrita

総合スコア236

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

igaiga

2016/05/11 08:40

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

2016/05/11 08:47

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

0

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

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

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

PHP

1//ifの場合 2<?php 3if (条件) { 4 //該当の処理 5 echo '<div class="img">'; 6 echo wp_get_attachment_image($id, "thumb_300", false); 7 echo '</div>'; 8} else { 9 //該当しなかった場合の処理 10 echo "失敗"; 11} 12?> 13 14//foreachの場合 15<?php 16 foreach ($hoge as $foo) { 17 //処理 18} 19 20合わせると 21<?php 22 foreach($hoge as $foo){ 23 if(条件){ 24 //処理 25 }else{ 26 //処理 27//ifの終わり 28}//foreachの終わり 29これでよいです。

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

HTML

1<h1>例えば</h1> 2 3<?php foreach($hoge as $foo): ?> 4<?pho if (条件): ?> 5 <div class="img"> 6 <?php echo wp_get_attachment_image($id, "thumb_300", false); ?> 7 </div> 8<?php else: ?> 9 <p>失敗です</p> 10 <?php echo '失敗です' ; ?> 11<?php endif; > 12<?php endforeach; ?>

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

PHP

1<?php 2foreach( $attachments as $id => $attachment ) { 3 if ( get_post_thumbnail_id($post->ID) == $attachment->ID ) { 4 echo '<div class="img">'; 5 echo wp_get_attachment_image($id, "thumb_300", false); 6 echo '</div>'; 7 } else { 8 echo "失敗"; 9 } //ifの終わり 10}//foreachの終わり 11 12これでコンティニューしなくても、ifの条件に該当すれば画像のecho処理をして次の$idに進みます。 13該当しない場合は、失敗と表示されて次の$idに進みます。 14?>

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

HTML

1<?php foreach( $attachments as $id => $attachment ): ?> 2 <?php if ( get_post_thumbnail_id($post->ID) == $attachment->ID ): ?> 3 <div class="img"> 4 <?php echo wp_get_attachment_image($id, "thumb_300", false); ?> 5 </div> 6<?php else: ?> 7 <?php echo "失敗"; ?> 8<?php endif; ?> 9<?php endforeach; ?> 10 11HTMLタグはechoせず普通に書きます。 12HTMLファイルにPHPを組み込んでる場合はこれでOKです。

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

投稿2016/05/11 08:47

smnsmn

総合スコア175

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

igaiga

2016/05/11 08:54

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

0

PHP

1<?php 2 foreach( $attachments as $id => $attachment ): 3 if( get_post_thumbnail_id($post->ID) == $attachment->ID ) { 4 continue; 5 echo '<div class="img">'; 6 echo wp_get_attachment_image($id, "thumb_300", false); 7 echo '</div>';} 8 endforeach; 9?>

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

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

投稿2016/05/11 08:07

kutsulog

総合スコア985

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

igaiga

2016/05/11 08:40

ありがとうございます
guest

0

php

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

投稿2016/05/11 08:02

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

igaiga

2016/05/11 08:15

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問