忍者ブログ

Wordpressメモとかアフィめもとか

Wordpress,PHP,アフィリエイトとかの個人メモを記録していくよ

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

phpでWarning: Invalid argument supplied for foreach()がでる

Warning: Invalid argument supplied for foreach()の警告。

simplexml_load_file()関数を使って結果をforeachでループさせる時に良く出る。
理由はforeachに配列じゃない変数を与えているから。

simplexml_load_file()関数を使ってAPIからの戻りをパースするときforeachの多重ループで処理をする事が多いのだけど、APIからの戻りの配列が多次元になっていてそれを良く見ないでforeachに突っ込んでるから。

$arr = array(
  0 => array(1,2,3),
  1=> '4'
  2=>array(5,6,7,8,9)
);


この$arrをforeachの2重ループでまわすと$arr[1]が配列じゃないので警告が出る。
なのでforeachで回す前にis_array()関数を使って配列のときだけforeachするようにする。











拍手[0回]

PR

php simplexml_load_fileでrssのxml取得

xmlを配列にしたいときにsimplexml_load_fileを使う。
以下、Yahooニュース・トピックス国内のRSSを取得するサンプル
<?php
  $rss_uri = 'http://rss.dailynews.yahoo.co.jp/fc/domestic/rss.xml';
  $xml = simplexml_load_file($rss_uri); 
  var_dump($xml);
?>


実行結果

object(SimpleXMLElement)#1 (2) {
  ["@attributes"]=>
  array(1) {
    ["version"]=>
    string(3) "2.0"
  }
  ["channel"]=>
  object(SimpleXMLElement)#2 (6) {
    ["title"]=>
    string(45) "Yahoo!ニュース・トピックス - 国内"
    ["link"]=>
    string(41) "http://dailynews.yahoo.co.jp/fc/domestic/"
    ["description"]=>
    string(114) "Yahoo! JAPANのニュース・トピックスで取り上げている最新の見出しを提供しています。"
    ["language"]=>
    string(2) "ja"
    ["pubDate"]=>
    string(31) "Sun, 21 Oct 2012 12:39:43 +0900"
    ["item"]=>
    array(8) {
      [0]=>
      object(SimpleXMLElement)#3 (5) {
        ["title"]=>
        string(37) "米司令官 沖縄訪問し謝罪へ"
        ["link"]=>
        string(109) "http://rd.yahoo.co.jp/rss/l/topics/topics/*http://dailynews.yahoo.co.jp/fc/domestic/us_armed_forces_in_japan/"
        ["pubDate"]=>
        string(31) "Sun, 21 Oct 2012 11:30:13 +0900"
        ["enclosure"]=>
        object(SimpleXMLElement)#11 (1) {
          ["@attributes"]=>
          array(3) {
            ["length"]=>
            string(3) "133"
            ["url"]=>
            string(38) "http://i.yimg.jp/images/icon/photo.gif"
            ["type"]=>
            string(9) "image/gif"
          }
        }
        ["guid"]=>
        string(25) "yahoo/news/topics/6071592"
      }
      [1]=>
      object(SimpleXMLElement)#4 (4) {
        ["title"]=>
        string(39) "前原氏、解散時期は「年内」"
        ["link"]=>
        string(97) "http://rd.yahoo.co.jp/rss/l/topics/topics/*http://dailynews.yahoo.co.jp/fc/domestic/noda_cabinet/"
        ["pubDate"]=>
        string(31) "Sun, 21 Oct 2012 12:35:44 +0900"
        ["guid"]=>
        string(25) "yahoo/news/topics/6071596"
      }
      [2]=>
      object(SimpleXMLElement)#5 (4) {
        ["title"]=>
        string(38) "岡田氏 3党で予算骨格協議を"
        ["link"]=>
        string(99) "http://rd.yahoo.co.jp/rss/l/topics/topics/*http://dailynews.yahoo.co.jp/fc/domestic/budgeting_2013/"
        ["pubDate"]=>
        string(31) "Sat, 20 Oct 2012 23:30:32 +0900"
        ["guid"]=>
        string(25) "yahoo/news/topics/6071551"
      }
      [3]=>
      object(SimpleXMLElement)#6 (4) {
        ["title"]=>
        string(38) "国の財源枯渇の可能性 なぜ?"
        ["link"]=>
        string(99) "http://rd.yahoo.co.jp/rss/l/topics/topics/*http://dailynews.yahoo.co.jp/fc/domestic/budgeting_2012/"
        ["pubDate"]=>
        string(31) "Sat, 20 Oct 2012 18:08:26 +0900"
        ["guid"]=>
        string(25) "yahoo/news/topics/6071534"
      }
      [4]=>
      object(SimpleXMLElement)#7 (4) {
        ["title"]=>
        string(40) "誤認逮捕 書き込みの疑問放置"
        ["link"]=>
        string(105) "http://rd.yahoo.co.jp/rss/l/topics/topics/*http://dailynews.yahoo.co.jp/fc/domestic/remote_control_virus/"
        ["pubDate"]=>
        string(31) "Sun, 21 Oct 2012 08:20:38 +0900"
        ["guid"]=>
        string(25) "yahoo/news/topics/6071573"
      }
      [5]=>
      object(SimpleXMLElement)#8 (4) {
        ["title"]=>
        string(36) "臨時国会 11月末までで調整"
        ["link"]=>
        string(91) "http://rd.yahoo.co.jp/rss/l/topics/topics/*http://dailynews.yahoo.co.jp/fc/domestic/kokkai/"
        ["pubDate"]=>
        string(31) "Sat, 20 Oct 2012 20:12:26 +0900"
        ["guid"]=>
        string(25) "yahoo/news/topics/6071541"
      }
      [6]=>
      object(SimpleXMLElement)#9 (5) {
        ["title"]=>
        string(40) "仕事中のけが 健康保険適用へ"
        ["link"]=>
        string(109) "http://rd.yahoo.co.jp/rss/l/topics/topics/*http://dailynews.yahoo.co.jp/fc/domestic/medical_treatment_system/"
        ["pubDate"]=>
        string(31) "Sat, 20 Oct 2012 15:46:53 +0900"
        ["enclosure"]=>
        object(SimpleXMLElement)#12 (1) {
          ["@attributes"]=>
          array(3) {
            ["length"]=>
            string(3) "133"
            ["url"]=>
            string(38) "http://i.yimg.jp/images/icon/photo.gif"
            ["type"]=>
            string(9) "image/gif"
          }
        }
        ["guid"]=>
        string(25) "yahoo/news/topics/6071521"
      }
      [7]=>
      object(SimpleXMLElement)#10 (5) {
        ["title"]=>
        string(40) "北日本・新潟 雨と突風に注意"
        ["link"]=>
        string(92) "http://rd.yahoo.co.jp/rss/l/topics/topics/*http://dailynews.yahoo.co.jp/fc/domestic/weather/"
        ["pubDate"]=>
        string(31) "Sat, 20 Oct 2012 20:50:02 +0900"
        ["enclosure"]=>
        object(SimpleXMLElement)#13 (1) {
          ["@attributes"]=>
          array(3) {
            ["length"]=>
            string(3) "133"
            ["url"]=>
            string(38) "http://i.yimg.jp/images/icon/photo.gif"
            ["type"]=>
            string(9) "image/gif"
          }
        }
        ["guid"]=>
        string(25) "yahoo/news/topics/6071543"
      }
    }
  }
}
 

タイトルのリンク作る

<?php
  $rss_uri = 'http://rss.dailynews.yahoo.co.jp/fc/domestic/rss.xml';
  $xml = simplexml_load_file($rss_uri);
  #var_dump($xml);
 
  foreach ( $xml->channel as $channel_val ){
    foreach ( $channel_val->item as $item_val ){
      echo '<a href="'.$item_val->link.'" title="'.$item_val->title.'">'.$item_val->title.'</a><br />';
    }
  }
 
?>

格納された配列にアクセスするのはforeach で配列ループをまわして->で階層をたどる。

実行結果
<a href="http://rd.yahoo.co.jp/rss/l/topics/topics/*http://dailynews.yahoo.co.jp/fc/domestic/us_armed_forces_in_japan/" title="米司令官 沖縄訪問し謝罪へ">米司令官 沖縄訪問し謝罪へ</a><br />
<a href="http://rd.yahoo.co.jp/rss/l/topics/topics/*http://dailynews.yahoo.co.jp/fc/domestic/noda_cabinet/" title="前原氏、解散時期は「年内」">前原氏、解散時期は「年内」</a><br />
<a href="http://rd.yahoo.co.jp/rss/l/topics/topics/*http://dailynews.yahoo.co.jp/fc/domestic/budgeting_2013/" title="岡田氏 3党で予算骨格協議を">岡田氏 3党で予算骨格協議を</a><br />
<a href="http://rd.yahoo.co.jp/rss/l/topics/topics/*http://dailynews.yahoo.co.jp/fc/domestic/budgeting_2012/" title="国の財源枯渇の可能性 なぜ?">国の財源枯渇の可能性 なぜ?</a><br />
<a href="http://rd.yahoo.co.jp/rss/l/topics/topics/*http://dailynews.yahoo.co.jp/fc/domestic/remote_control_virus/" title="誤認逮捕 書き込みの疑問放置">誤認逮捕 書き込みの疑問放置</a><br />
<a href="http://rd.yahoo.co.jp/rss/l/topics/topics/*http://dailynews.yahoo.co.jp/fc/domestic/kokkai/" title="臨時国会 11月末までで調整">臨時国会 11月末までで調整</a><br />
<a href="http://rd.yahoo.co.jp/rss/l/topics/topics/*http://dailynews.yahoo.co.jp/fc/domestic/medical_treatment_system/" title="仕事中のけが 健康保険適用へ">仕事中のけが 健康保険適用へ</a><br />
<a href="http://rd.yahoo.co.jp/rss/l/topics/topics/*http://dailynews.yahoo.co.jp/fc/domestic/weather/" title="北日本・新潟 雨と突風に注意">北日本・新潟 雨と突風に注意</a><br />
 
ブラウザで見るとこんな感じ。

米司令官 沖縄訪問し謝罪へ
前原氏、解散時期は「年内」
岡田氏 3党で予算骨格協議を
国の財源枯渇の可能性 なぜ?
誤認逮捕 書き込みの疑問放置
臨時国会 11月末までで調整
仕事中のけが 健康保険適用へ
北日本・新潟 雨と突風に注意


simple_xmlは便利だね。

拍手[0回]

PHPの日付計算

PHPは日付型が無いので面倒くさいので調べた。

echo "1日前" . date("Y/m/d",strtotime("-1 day"));
echo "1ヶ月前" . date("Y/m/d",strtotime("-1 month"));
echo "1年前" . date("Y/m/d",strtotime("-1 year"));
echo "1週間前" . date("Y/m/d",strtotime("-1 week"));

拍手[0回]

PHP構文チェック

WordpressにEXEC-PHPをいれて直で編集してるとデバッグが面倒なので。。

http://jp.piliapp.com/php-syntax-check/

拍手[0回]

ブログ内検索

最新コメント

広告

プロフィール

なんとなくはじめてみたよ

忍者ツールズプロフィールは終了しました

カウンター