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

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

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

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

if

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

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

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

Q&A

解決済

1回答

1680閲覧

PHPのループforeachの表示がリセットされません。ループ処理に詳しい方お願いします。

musashidayo

総合スコア54

foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

if

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

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

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

0グッド

0クリップ

投稿2018/02/13 11:17

'関連A'というカスタムフィールドに入っているpostをforeachでループさせてる中で、'関連B'というカスタムフィールドにも属していた場合に何番目かという処理を書いたのですが、値が入っていないpostのときにも、その一個前の値が反映されてしまい、うまく機能しません。

<ul> <?php $page = get_page_by_path('関連Aの固定ページ'); $my_ranking = get_field('関連A',$page->ID); if ( $my_ranking ) { $number = 1; global $wpdb; global $rateAvg; ?> <?php foreach($my_ranking as $value){ if ( $number >= 11){ break; } setup_postdata($value); ?> <?php $ID = $value->ID; $rateQuery = " SELECT AVG(meta_all.meta_value) AS avg FROM ( SELECT meta.meta_value FROM ( SELECT comment_ID, comment_post_ID FROM wp_comments WHERE comment_approved = 1 AND comment_post_ID = ".$ID." ) comment, ( SELECT comment_ID, meta_value FROM wp_commentmeta WHERE meta_value is not null ) meta WHERE comment.comment_ID = meta.comment_ID ) meta_all; "; $rateAvg = $wpdb->get_results($rateQuery); ?> <li> <a href="<?php the_permalink($value->ID); ?>"> <?php echo get_the_title($value->ID); ?> </a> <?php echo get_the_post_thumbnail($value->ID); ?> <?php $ppage = get_page_by_path( '関連Bの固定ページ' ); $site_list = get_field('関連B',$ppage->ID); $i = 1; if ( $site_list) { foreach ($site_list as $vvalue){ $ss = $vvalue -> ID; if ( $ID == $ss ) { echo $i++."位"; break; } $i++; if(!($site_list[$i])){ echo "圏外"; break; } ?> <?php } wp_reset_postdata();} ?> <!--ここに'関連A'のポストの内容を再度用いて表示する内容が入る--> <?php wp_reset_postdata(); ?> <?php $number++;}}?> </li> </ul>

元々あった内容に真ん中の「$ppage〜break;」の部分を入れ子にしている形なのが原因だとは思われるのですが、ループ処理に詳しい方のご指導お願いします。

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

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

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

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

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

yambejp

2018/02/13 12:19

質問が冗長で質問内容がブレています。SQLの部分は簡単な配列に置き換えて、どうだったらどうループを止めたいのか明示したほうがよいでしょう
退会済みユーザー

退会済みユーザー

2018/02/13 23:55

あとインデントがひどい
m.ts10806

2018/02/14 00:34

質問テンプレートにそって書くことで質問内容を整理されるよう強くすすめます。
m.ts10806

2018/02/14 00:36

asahina1979 さん if($myranking)の閉じ部分探すのに数分かかりましたね。。結局コードコピペしてフォーマッターにかけましたが
退会済みユーザー

退会済みユーザー

2018/02/15 12:42

ひとつめのwp_reset_postdataが余計ではないでしょうか。
guest

回答1

0

ベストアンサー

コード読んでないです。質問内容に対しての勘です

値が入っていないpostのときにも、その一個前の値が反映されてしまい、うまく機能しません。

よくあるのは、値の初期化忘れです。
ループの頭で初期化して、ループの中で値を入れるようにすると、一つ前の値が入るといったことはなくなります。

投稿2018/02/13 23:13

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

musashidayo

2018/02/16 03:52

ループ毎に一つ一つ初期化していったらしっかりと表示されるようになりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問