dポイントプレゼントキャンペーン実施中!

http://oshiete.goo.ne.jp/qa/8277847.html
で、No2のagunuz様にご教示いただいたサンプルを以下のように組み込みました。
(当方コメントは■です)

$sv_magazine = '';
while ($col = mysql_fetch_array($rst)) {
$magazine = $col['magazinecode'];
if ($magazine !== $sv_magazine) {
if ($sv_magazine !== '') {
// 前のマガジン番号($sv_magazine)のフッタ(必要があれば)
$body .= "</ul>\n"; //■この行を加筆しました
}
// 今読んだマガジン番号($magazine)のヘッダ
$body .= "<h1>【" . $col['yyyymm'] . "】</h1>\n"; //■この行を加筆しました
$body .= "<ul>\n"; //■この行を加筆しました
$sv_magazine = $magazine;
}
// $col から明細を出力
$body .= "<li>". $col["category"] ; //■ここから・・・・
$body .= "<ul>\n";
$body .= "<li>" . $col["title"];
$body .= "<ul>\n";
$body .= "<li>" . $col["author"];
$body .= "</ul>\n";
$body .= "</ul>\n"; //■・・・ここまでの行を加筆しました
} // ループ終了
if ($sv_magazine !== '') {
// 最後のマガジン番号($sv_magazine)のフッタ(必要があれば)
$body .= "</ul>\n"; //■この行を加筆しました
}


上記を実行し、元質問にお示ししたサンプルレコードを読み込むと、以下のように出力されます。
(箇条書きインデントのポツのレベルは、1は●、2は◇、3は◎と仮定します)
ただ、当前ですが、同じ号の同じ「分類(『特集』、『連載』などの文言)」が2回目以降にもでてくるのはスマートでないので、注記した行は間引いて、以下のようにスッキリHTMLに出力表示させたいと思います。

【2013年5月号】
●特集:折り紙
 ◇作成法1
  ◎山本
●特集:折り紙  【←この行は2度目なので間引いて表示しない】
 ◇作成法2
  ◎佐藤
●特集:折り紙  【←この行も3度目なので間引く】
 ◇作成法3
  ◎岩田
●連載
 ◇はさみ研ぎ方
  ◎伊藤
●連載     【←この行は2度目なので間引く】
 ◇のりの選び方
  ◎野口

当方での想像として、ループ中、もし$col["category"]の文字列が前に出てきたのと同一ならスキップ(非表示)でいいよ、というスイッチを加筆すれば良さそうですが、どのように記述したらよろしいでしょうか。

(質問とぜんぜん関係ないですが、冒頭のコードで、$sv_magazine = '';と初期化?させているのは理解できますが、WHILEの外側でなぜ効くのか、悩んでます(^_^;)

A 回答 (1件)

私の以前のPDOを使った回答で



 // 結果を取り出して表示しやすいようにセットしていく
 $data = array();
 foreach ($stmt as $row) {
  if ($row['title'] === '') {
   $data[$row['yyyymm']][$row['category']] = '';
  } elseif ($row['category'] === '') {
   $data[$row['yyyymm']][$row['title']] = $row['author'];
  } else {
   $data[$row['yyyymm']][$row['category']][$row['title']] = $row['author'];
  }
 }

としているところがあったと思いますが、このように一度連想配列にセットすることで、親見出しが重複するものを一つにまとめることができます。mysql関数を使った場合でもやってることは同じなので参考にしてください。
(PDOが一見難しそうに見えるかもしれませんが、「クラスとオブジェクトが分からない」という思い込みから毛嫌いしているだけかもしれないので、チャレンジしてみてください。実際何も難しいことはありません。コーディング自体もPDOを使ったほうが短く書けますしラクです。)


>> (質問とぜんぜん関係ないですが、冒頭のコードで、$sv_magazine = '';と初期化?させているのは理解できますが、WHILEの外側でなぜ効くのか、悩んでます(^_^;)

変数のスコープ
http://php.net/manual/ja/language.variables.scop …

スコープを構成する単位には「グローバル空間」「名前空間」「クラス」「メソッド」「関数」「無名関数(クロージャ)」などがあります。「if」「while」「for」「foreach」などが含まれていないことに注意してください。このあたりが他の言語と実装が大きく異なります。PHP独特です。
    • good
    • 0
この回答へのお礼

To_aru_Userさん、いつもお世話になります。また、早速のご回答ありがとうございました。

PDOですが、一度は前回もご教示いただいたサイトなどを確認しながら導入をやりかけたのですが、php.iniの編集などでつまづいていました。

とりあえず、今回の雑誌索引は、当面社内LAN内での運用にとどまる見込みで、対外的(WWW)に公開するとなればそのときでよいかと後回しになっていました。全て言い訳ですが。。。どうもすみません。いずれ必ず取り組む課題の筆頭にはなっております。

>このあたりが他の言語と実装が大きく異なります。PHP独特です。

詳しく教えていただき大変ありがとうございます。
やや難しい話ですが、事情がわかって非常にすっきりしました。

お礼日時:2013/10/16 14:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!