• ベストアンサー

functionについて

こんばんは。お世話になっております。 自分の勉強不足を披露してしまうようでお恥ずかしいのですが、レッツPHPさんの「新着ブロガー」 http://php.s3.to/net/#rss を1件のみの表示とするよう設定し、検索結果として自分のソース内にあるwhileの中に、include("./rss/rssup.php"); と記載しているのですが、検索結果を実行させたとき、レッツPHPさんの「rssup.php」ソース内の、 // 日付ソート関数 function cmp ($a, $b){ $a = (isset($a['items'][0]['pubdate'])) ? strtotime($a['items'][0]['pubdate']) : strtotime(str_replace("T", " ", substr($a['items'][0]['dc:date'], 0, 19))); $b = (isset($b['items'][0]['pubdate'])) ? strtotime($b['items'][0]['pubdate']) : strtotime(str_replace("T", " ", substr($b['items'][0]['dc:date'], 0, 19))); if ($a == $b) return 0; return ($a > $b) ? -1 : 1; }//※※ ※印のところでエラーが表示されてしまいます。 先にも申したように、自分の知識のなさを告知するようで大変お恥ずかしいとは思いながらも、調べていても解決する事が出来ず、あえて投函させていただきました。 お忙しい中恐縮ですが、アドバイスなど頂戴出来たら幸いです。 宜しくお願い致します。

  • PHP
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • kirin_f
  • ベストアンサー率51% (44/85)
回答No.3

>検索し、検索一覧を表示させる際、DBに登録されたURLを基にrssup.phpによって、そのURLに記載のある最新記事を取得したいと考えての設置でした。 includeをどうするかというより、もともとの新着ブロガーの方のプログラムの変更が必要かと思います。取得もとのURLをDBから取り出すようにはなっていないですし、whileの中で複数回includeというか実行できたとしても、すべて同じ表示がでるだけでで希望の動作にはならないでしょう。 rssup.phpを以下のように変えて ----------------------------------------------------------------- <? //require "RSS.php"; //PEAR導入済みの場合↓ require "XML/RSS.php"; // サイト文字コード(SJIS、EUC-JPなど) $code = "SJIS"; // 日付ソート関数 function cmp ($a, $b) { $a = (isset($a['items'][0]['pubdate'])) ? strtotime($a['items'][0]['pubdate']) : strtotime(str_replace("T", " ", substr($a['items'][0]['dc:date'], 0, 19))); $b = (isset($b['items'][0]['pubdate'])) ? strtotime($b['items'][0]['pubdate']) : strtotime(str_replace("T", " ", substr($b['items'][0]['dc:date'], 0, 19))); if ($a == $b) return 0; return ($a > $b) ? -1 : 1; } function GetRss($rssurl) { // RSS取得・解析 $r =& new XML_RSS($rssurl); if (PEAR::isError($r)) continue; $r->parse(); if ($r->getChannelInfo()) $ch[$k] = $r->getChannelInfo(); $ch[$k]['items'] = $r->getItems(); usort($ch, "cmp"); // サイト名 $site_title = htmlspecialchars(mb_convert_encoding($ch[0]['title'], $code, "UTF-8,EUC-JP,SJIS")); // サイトURL $site_link = $ch[0]['link']; // 記事タイトル $title = mb_convert_encoding(strip_tags($ch[0]['items'][0]['title']), $code, "UTF-8,EUC-JP,SJIS"); // 記事内容 $desc = mb_convert_encoding(strip_tags($ch[0]['items'][0]['description']), $code, "UTF-8,EUC-JP,SJIS"); // 記事URL $link = htmlspecialchars($ch[0]['items'][0]['link']); // 記事更新時間(UNIXタイム $time = (isset($ch[$i]['items'][0]['pubdate'])) ? strtotime($ch[0]['items'][0]['pubdate']) : strtotime(str_replace("T", " ", substr($ch[$i]['items'][0]['dc:date'], 0, 19))); // 記事更新日 http://php.net/date $date = date("Y/m/d", $time); // 表示 echo <<<B <a href="{$site_link}" target="_new">{$site_title}</a> / <a href="{$link}" target="_new" title="{$desc}">{$title}</a>&nbsp;({$date})<br> B; } ?> ----------------------------------------------------------------- include("./rss/rssup.php");をwhileの前に入れて、whileの中でincludeしていた部分に、 GetRss($rssurl); をいれて、$rssurlにDBから取り出した取得元URLを入れてください。

sadacha
質問者

お礼

kirin_f様 お忙しい中、早速のお返事をいただき、またソースまでご提示いただき有難う御座います。 ここ2週間ほど、情けないかな、全く進展が見られない状況の中、自分自身にも歯がゆいところでしたが、kirin_f様からご提示いただいたソースにて、描いていた結果を得ることが出来ました! 言葉足らずなご挨拶で恐縮ですが、有難い気持ちで一杯です。本当に有難う御座いました!

その他の回答 (2)

  • kirin_f
  • ベストアンサー率51% (44/85)
回答No.2

経験上、「Cannot redeclare ~」と出るときって、同じ名前の関数が複数あったり、 同じファイルを2度以上includeとかrequireしようとしているときにでるような気がします。 要するに同じ名前の関数名が複数あってはいけないのに、読み込もうとしているから「宣言できない」とでるわけです。 >自分のソース内にあるwhileの中に、include("./rss/rssup.php"); whileでまわる回数分、rssup.phpを読み込もうとしているので、それで同じ関数が複数回読み込まれてエラーが出ているのではないでしょうか。 include("./rss/rssup.php")ではなく、include_once("./rss/rssup.php")とかしてみたらどうですか。

sadacha
質問者

お礼

kirin_f様 はじめまして、こんばんは。 皆さま同様、ご親切なアドバイスに感謝いたします。 >include_once("./rss/rssup.php")とかしてみたらどうですか。 私の説明不足でしたが、whileの中に入れるというのも、その都度同じことをさせたいのです。イメージとしては、 検索し、検索一覧を表示させる際、DBに登録されたURLを基にrssup.phpによって、そのURLに記載のある最新記事を取得したいと考えての設置でした。 include_onceで行うと、一番最初の(検索)結果は実行されますが、2行目以降が実行されずに、includeとだけで設置している次第です。 ならばと、直接whileの中に、reeup.phpの内容を記述してみましたが、 Fatal error: Cannot redeclare class xml_rss in と、なにやら宿命的とかいうエラーが出てしまいます。 お忙しい中恐縮ですが、引き続きアドバイスなど頂けたら幸いです。

  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

エラーが出た場合はエラー文にその原因が表示されます。 普通はそれを読むだけで解決に至ることが多いので英語だからと無視しないでちゃんと読むようにしましょう。 またエラーについて質問するときは必ずエラーの内容を書くようにしましょう。 例えば Cannot redeclare cmp() (previously declared in~ なら関数の再宣言は出来ませんという意味で同じ名前の関数が宣言されたと言うことです。 whileの中にincludeを書いていると言うことですがそうするとループの回数だけrssup.phpが実行されます。実行だけなら問題ありませんが中に関数の宣言がされているとそれも複数回宣言されることになり上記のエラーが出ます。 ループの中でincludeする場合はinclude_once()を使うようにしましょう。 エラーの内容が違う場合は補足してください。

sadacha
質問者

お礼

php504さま こんにちは。お世話になっております。 早速のご回答をありがとう御座います。エラーの件、以降気をつけます。 Fatal error: Cannot redeclare cmp() (previously declared in php504様が仰るように、上記が今回のエラーですが、「宣言出来ない」といった意味までは理解していたのですが、質問の題名にあるようにfunctionを調べているうちに、知識不足から何処をどう変更すべき?と分からなくなってしまったのが現状です。 また、当初はinclude_once()で行ったところ、1度目だけ実行(後は実行されずエラーもない)される、といった状況だったため、includeで記述しているところでした。 勉強不足を痛感しておりますが、何をどうすれば良いのか分からずにおります。お忙しい中恐縮ですが、引き続きアドバイスなど頂戴できたら幸いです。宜しくお願い致します。

関連するQ&A

  • RSSデータ表示に関しまして【ギブアップです】

    先週からRSSデータの表示について作業が止まっております。 ご存知でしたら、皆様のお知恵をお借りしたいと思い質問させて頂きました。 複数のブログの記事を更新時間順に表示したいと思っています。 こんな感じです。 ⇒ http://blogs.yahoo.co.jp/FRONT/update.html 例えば、同じBLOGから数分後に2度更新されたら、その記事タイトルも表示します。 ※1BLOG 1エントリーの表示ではなく、1BLOG 複数エントリーの表示が可能であり、  あくまで更新時間順に表示します。 また、表示件数も指定したいと思っています。 このようなPHPのサンプルがあるサイトなどご存知でしたら教えてください。 お願い申し上げます。 ちなみに現在作成できているPHPのソースは以下通りで、更新時間順に記事を表示できますが、 記事の表示件数が指定できないので全ての記事を表示してしまいます。 1BLOG5つの記事を読み込んでいき、ソートし表示しています。 表示件数の指定方法がわからず、またプログラムも初めてなので無茶苦茶な作りになっています。 上述のPHPサンプルか以下ソースで表示件数の指定および配列の操作についてご教示お願いします。 <?php require "xxx/yyy/RSS.php"; // 表示データ用配列の初期化 $showArray = array(); // RSSサイトURL(複数可) $rdf[] = "http://xxxxxxxxx/xxxxx/"; $rdf[] = "http://yyyyyyyyy/yyyyy/"; // 変数初期値 $num = 0; $datacnt = 0; // サイト文字コード(SJIS、EUC-JPなど) $code = "SJIS"; // 日付ソート関数 function cmp ($a, $b) { $a = (isset($a['items'][0]['pubdate'])) ? strtotime($a['items'][0]['pubdate']) : strtotime(str_replace("T", " ", substr($a['items'][0]['dc:date'], 0, 19))); $b = (isset($b['items'][0]['pubdate'])) ? strtotime($b['items'][0]['pubdate']) : strtotime(str_replace("T", " ", substr($b['items'][0]['dc:date'], 0, 19))); if ($a == $b) return 0; return ($a > $b) ? -1 : 1; } // RSS取得・解析 foreach ($rdf as $k=>$rssurl) { $r =& new XML_RSS($rssurl); if (PEAR::isError($r)) continue; $r->parse(); if ($r->getChannelInfo()) $ch[$k] = $r->getChannelInfo(); $ch[$num]['items'] = $r->getItems(); $num = $num + 1; } usort($ch, "cmp"); for ($i=0; $i<$num; $i++) { // サイト名 $site_title = htmlspecialchars(mb_convert_encoding($ch[$i]['title'], $code, "UTF-8,EUC-JP,SJIS")); // サイトURL $site_link = $ch[$i]['link']; for ($n=0; $n<5; $n++) { // 記事タイトル $title = mb_convert_encoding(strip_tags($ch[$i]['items'][$n]['title']), $code, "UTF-8,EUC-JP,SJIS"); // 記事内容 $desc = mb_convert_encoding(strip_tags($ch[$i]['items'][$n]['description']), $code, "UTF-8,EUC-JP,SJIS"); // 記事URL $link = htmlspecialchars($ch[$i]['items'][$n]['link']); // 記事更新時間(UNIXタイム $time = (isset($ch[$i]['items'][$n]['pubdate'])) ? strtotime($ch[$i]['items'][$n]['pubdate']) : strtotime(str_replace("T", " ", substr($ch[$i]['items'][$n]['dc:date'], 0, 19))); // 記事更新日 http://php.net/date $date = date("m/d H:i", $time); $dummy = date("m", $time) . date("d", $time) . date("H", $time) . date("i", $time); $showArray[$dummy] = "<FONT SIZE=2><a href=\"" . $link . "\" target=\"_new\" title=\"" . $desc . "\">" . $title . "</a>&nbsp;【<a href=\"" . $site_link . "\" target=\"_new\">" . $site_title . "</a>】(" . $date . ")</FONT><br>"; $datacnt = $datacnt + 1; } } // 時間順でソート(必要なのかは良くわからないが上手くいかなかったりする...) krsort($showArray); // HTML表示させる echo(join('',$showArray)); ?>

    • ベストアンサー
    • PHP
  • RSSブロガーの日時表示について

    レッツPHPさんのRSSブロガーを利用しております。 http://loglog.jp/~php/net/ 機能に日時を表示させたく以下のソースを記入しました 27行目付近より for ($i=0; $i<$num; $i++) { $val = $r->getItems(); $title = mb_convert_encoding(strip_tags($val[$i]['title']), $code, "UTF-8,EUC-JP,SJIS"); $desc = mb_convert_encoding(strip_tags($val[$i]['description']), $code, "UTF-8,EUC-JP,SJIS"); $link = htmlspecialchars($val[$i]['link']); $date = $val[$i]['dc:date']; $time = (isset($val[$i]['pubdate'])) ? strtotime($val[$i]['pubdate']) : strtotime(str_replace("T", " ", substr($val[$i]['dc:date'], 0, 19))); $koushin = date("Y/m/d", $time); // 内容 echo <<<B <tr bgcolor="#ffffff"><td><small> $koushin <a href="$link" target=_new>$title</a><br> $desc </small></td></tr> B; } これで日時も表示が出来たのですが、RSSブロガーの最大表示件数を5件にします。 例えば1件ブログなどで書き込みをこのRSSブロガーの部分で表示をすると1件は日時とタイトルが表示されるのですが、残りの4件の日付が1970/01/01 と表示されタイトル無しの表示が4つ並びます。 ↓このような感じ 2008/02/14 テスト 1970/01/01  (空白) 1970/01/01  (空白) 1970/01/01  (空白) 1970/01/01  (空白) これだと見た目が悪いので空白部分の日時と空白部分は表示させたくないのですが、何か良い方法はございますか宜しくお願い致します。

    • ベストアンサー
    • PHP
  • MagpieRSSで異なる複数のブログを表示

    お世話になります。PHPの初心者です。 MagpieRSSを使用して、異なる複数のブログを1つの更新欄にまとめ、 最新記事を5件表示させたいです。 いろいろ参考にしながら、下記のようなソースを組み、 なんとか複数のブログを1つにまとめるまでは出来ました。 しかしながら件数の指定方法がわからず、困っています。 どのようにしたら5件表示できるようになるでしょうか? 宜しくお願い致します。 <?php require_once 'rss_fetch.inc'; require_once 'rss_utils.inc'; require_once 'jcode.php'; include_once 'rss_utils.inc'; define('MAGPIE_OUTPUT_ENCODING', 'UTF-8'); define('MAGPIE_CACHE_ON', false); $url = array( 'http://example1.com/index.xml', 'http://example2.com/index.xml', 'http://example3.com/index.xml', 'http://example4.com/index.xml'); for ($i = 0; isset($url[$i]); $i++) { $rss = fetch_rss($url[$i]); $title = $rss->channel['title']; $title = mb_convert_encoding($title, "Shift_JIS", "UTF-8"); $rss->items = array_slice($rss->items, 0, 5); foreach ($rss->items as $item ) { $title = $item[title]; $title = mb_convert_encoding($title, "Shift_JIS", "UTF-8"); $item_url = $item[link]; $itemday = date('Y-n-j',strtotime(substr($item['dc']['date'],0,10))); $mday = date('w',strtotime(substr($item['dc']['date'],0,10))); echo "<li><strong>${itemday} $youbi[$mday] ${itemtime}</strong><a href=\"$item_url\">$title</a></li>\n"; } echo "\n"; } ?>

    • ベストアンサー
    • PHP
  • 自作RSSリーダでライブドアブログを読み込む

    自作のRSSリーダーを作ったのですが、ライブドアブログの更新時間が全て1970-01-01になってしまいます。PHPで if ($item['dc']['date'] != '') { $dt = parse_w3cdtf($item['dc']['date']); } else if($item['pubdate'] != '') { $dt = strtotime($item['pubdate']); } else { $dt = time(); } といった感じにしています。何が悪いのかわからないので教えて下さい。

    • 締切済み
    • PHP
  • [wordpress]外部RSSを「文字数制限」してリストで取得[php]

    初めまして。 wordpress、php初心者です。 タイトル通り、外部のRSSを自分のサイトで、 リスト表示させようと思っています。 ------------ <h1><?php _e('Headlines from Yahoo ITmedia News'); ?></h1> <?php // Get RSS Feed(s) include_once(ABSPATH . WPINC . '/rss.php'); $rss = fetch_rss('http://headlines.yahoo.co.jp/rss/itmedia_n.xml'); $maxitems = 5; $items = array_slice($rss->items, 0, $maxitems); ?> <ul> <?php if (empty($items)) echo '<li>No items</li>'; else foreach ( $items as $item ) : ?> <li><a href='<?php echo $item['link']; ?>' title='<?php echo $item['title']; ?>'> <?php echo $item['title']; ?> </a></li> <?php endforeach; ?> </ul> ------------ 上記のソースで表示はひとまずできました。 あと、これを文字数制限(たとえば10文字以上は「…」)で表示 としたいのですが、どうしたらいいのでしょうか? ------------ <?php $title= mb_substr($post->post_title,0,10); echo '<h1>'.$title.'…</h1>'; ?> ------------ 上記の「mb_substr(」を組み合わせればできそうなのですが、 理解不足な分、うまくいきません。 誰が、教えてください。よろしくお願いします。

    • ベストアンサー
    • PHP
  • RSS 日付の取得方法

    見てくださった方、こんにちは。 php超初心者のkitakaruと申します。 ホームページを作っていて、 RSSを取得して表示させたいのですが、 それが出来ずにほとほと困っています。 htmlやcssは多少分かるのですが、 phpは全くといっていいほど分かりません。 どなたか詳しい方がいらしゃいましたら、 ご教示頂けますでしょうか。 よろしくお願い致します。 呼び出しているxmlの形式はrss2.0です。 http://i-njoy.net/tips/rss.shtml こちらのサイトを参考に 以下のようソースを書きました。 (1)のpubdateというタグの値を引っ張ってこれず そこで行き詰ってしまっています。 ちなみにタイトルなどはきちんと表示されています。 分かる方、どうぞよろしくお願いします。 <?php require_once 'rss_fetch.inc'; require_once 'code_table.ucs2jis'; require_once 'jcode.php'; $url = 'http://www.xxxxxxxxxxxxx/index.xml?mode=rss'; $rss = fetch_rss($url); $title = $rss->channel['title']; $date1 = htmlspecialchars($item['pubdate']);  //(1)rss 出力日時を取得して 変数data1に代入 $date2 = date("Y.m.d", strtotime($date1));   //(2)表示形式変換 data1を変換したものを変数data2に代入 //JcodeConvert($str, $from, $to) //0:PASS(無変換)1:EUC-JP 2:Shift_JIS 3:ISO-2022-JP(JIS) 4:UTF-8 $title = JcodeConvert($title, 4, 4); foreach ($rss->items as $item ) { $title = $item[title]; $title = JcodeConvert($title, 4, 4); $url = $item[link]; echo '<li><dl><dt>'.$date1.'</dt><dd><a href="'.$url.'">'.$title.'</a></dd></dl></li>'; //(3)変数data2を出力 } ?>

    • ベストアンサー
    • PHP
  • PHP ブログの交信記録

    PHP初心者です。 下記のソースで一行目の$rss = simplexml_load_file( 以降にアドレスを入れて、ブログの更新情報を表示させたいのですが、うまくいきません。なぜでしょうか? <?php $rss = simplexml_load_file("http://d.hatena.ne.jp/xxxx/rss"); foreach ($rss->item as $item) { $dc = $item->children('http://purl.org/dc/elements/1.1/'); $link = $item->link; $title = $item->title; $date = $dc->date; $date = strtotime($date); $date = date('Y/m/d',$date); echo "<li>$date&nbsp;:&nbsp;<a href=\"$link\">$title</a></li>\n"; } ?>

    • 締切済み
    • PHP
  • 記号全削除のクラスを作成したい

    お世話になります。 PHPフォームの入力正規化を行っているのですが 記号が入っていた場合記号を全て削除する クラスを1つ作成したいと思っています。 function kigousakujyo($str) { $str = str_replace("@", "", $str); $str = str_replace("@", "", $str); $str = str_replace("<", "", $str); . . . return $str; } このような作りでは無駄が多い為もっとスマートな作りをと 考えているのですが、どなたかアドバイスをいただけたらなと思います。 よろしくお願いします。

    • 締切済み
    • PHP
  • RSSのpubDataを日本語フォーマットにしたい JSON使用

    自作のhtmlで作成したHPに、RSSの情報を表示させています。 http://q.hatena.ne.jp/1165960016 ↑こちらの、一番下の、 "XML 2 JSON service"を使用した方法で、表示していますが… <html> <head></head> <body> <script type="text/javascript" src="http://app.drk7.jp/xml2json/var=HATENARSS&url=http://~★以下任意のアドレス★" charset = 'UTF-8'></script> <script type="text/javascript"><!-- var items = HATENARSS.data['channel']['item']; /* 表示設定 */ var readCount = 10; //対象とする記事の件数 var StrLengthDescript=150; //表示する本文の文字数 /* 取得したデータを表示する */ var html = '<dl>'; for(var i = 0 ; i < items.length && i < readCount ; i++ ){ var pubDate = items[i]["pubDate"]; pubDate = pubDate.replace(" ", ""); //全角スペースを削除 if(pubDate.length > StrLengthDescript){ pubDate = pubDate.substr(0,StrLengthDescript)+'...' }; html += '<dt><a href="' + items[i]["link"] + '">' + items[i]["title"] + '</a></dt><dd>'+ pubDate + '</dd>'; }; html += '</dl>'; document.write(html); //--> </script> </body> </html> このような方法で、pubDateを、<dd></dd>の部分に表示させていますが… Fri, 19 Jun 2009 18:00:00 +0900 と、そのままで表示されてしまいます。 これを、"2009年6月19日"と表示させたいのですが… どのようにしたら良いでしょうか。 pubDateを取得して…YYYY/MM/DDなどと置き換えるのかな?と思いますが イマイチここからどうやったらいいのか分かりません…。 ご存知の方、教えていただけたら幸いです。 よろしくお願いいたします。

  • SCRIPTの意味を教えてください

    PHPにて実体参照について調べています。 以下のソースになんとなく興味が沸くのですがどういう処理をするためのものなのかよく分かりません。よかったら教えてください。 function append (&$str1, $str2="") { if (!isset($str1) ) { $str1=""; } $str1 .= $str2; }

    • ベストアンサー
    • PHP

専門家に質問してみよう