• ベストアンサー

foreach文について

素朴な質問をさせてください。 変数"$test"があります。これをあるwebページにて$type条件で指定した要素が存在する数だけ回して表示しています。 <html> <body> <? $testlist = gettestList($type); foreach ($testlist as $test) { ?> ・ <?= hs($test["URL"]) ?> ・ <? } ?> <body> <html> このとき、foreach文中の($test["URL"])の値が 前のループの時と同じ値の場合は<?= hs($test["URL"]) ?>では何も表示させないようにしたい(その要素の値はなしにしたい)のです。 たとえば$testの$type条件で指定された要素の値(表示されるべき"URL"値)は下記があるとします。 http://oshiete1.goo.ne.jp/ http://oshiete1.goo.ne.jp/ http://hogehoge.com/ http://gehogeho.com/ このときのbody内の表示は http://oshiete1.goo.ne.jp/ http://hogehoge.com/ http://gehogeho.com/ と表示されるようにしたいのです。 どうかご教授の程、よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.2

こういう方法はいかがでしょうか。 ループの中で配列変数(ここでは$found)の連想配列のキーとして$test["URL"]を使用し、配列にダミー値をセットします。 連想配列に指定したキーがあるかどうかを array_key_exists() で調べ、ない場合に「はじめて出てきた」と判断して hs($test["URL"])を出力し、$test["URL"]をキーとしてセットします。 <html> <body> <? $testlist = gettestList($type); unset($found); $found[0]=1; //$foundを配列変数と定義するためのダミー行 foreach ($testlist as $test) { ?> ・ <? if (!array_key_exists($test["URL"],$found)) { print hs($test["URL"]); $found[$test["URL"]] = 1; } ?> ・ <? } ?> <body> <html>

shinmaiphp
質問者

お礼

無事解決いたしました。 貴重な参考意見感謝いたします。 ホントにどうもありがとうございました。

shinmaiphp
質問者

補足

非常にスマートな方法をありがとうございます。 この方法の場合、同じ値がをもつ要素が複数あるとき 最初に同じ値を持つ要素のみ、表示しないでくれますが、 次からまた複数表示されてしまいます。 例>​ http://oshiete1.goo.ne.jp/http://oshiete1.goo.ne.jp/http://hogehoge.com/http://gehogeho.com/http://gehogeho.com/​ 表示される内容 http://oshiete1.goo.ne.jp/http://hogehoge.com/http://gehogeho.com/http://gehogeho.com/​ 有効な方法をご教授いただいたにもかかわらず、 度々恐れ入りますが、 複数の値を持つ要素が複数あっても重複表示を防ぐ方法ありますでしょうか?

その他の回答 (1)

noname#26650
noname#26650
回答No.1

> <?= hs($test["URL"]) ?> これが何を意図しているのかと、gettestList関数の仕様とが不明であるため、 的外れな回答であるかもしれませんが、例えばこんな風にしてみてはいかがでしょうか。 <html> <head></head> <body> <?php // gettestList関数で取得したつもり $testlist = array('http://oshiete1.goo.ne.jp/', 'http://oshiete1.goo.ne.jp/', 'http://hogehoge.com/', 'http://gehogeho.com/' ); $prev = ''; foreach ($testlist as $test) {   if ($test != $prev) {     print "<a href=\"$test\">$test</a><br />";   }   $prev = $test; } ?> </body> </html> (注)インデントのため、全角空白を使っています。

shinmaiphp
質問者

お礼

無事解決いたしました。 貴重な参考意見感謝いたします。 ホントにどうもありがとうございました。

関連するQ&A