IRCに地震速報RSSを取得して流しているが、震度1〜2が出まくってウザい。
そこで震度1〜2をカットして出すプログラムを作ってそれを読ませる事にした。
1 2 3 4 5 6 7 8 9 10 11 |
$rss = simplexml_load_file('http://weather.livedoor.com/forecast/rss/earthquake.xml'); $c = $rss->channel->item->count(); for($i=0; $i<$c; $i++){ $item = $rss->channel->item[$i]; if(preg_match('/震度\s+[1-2]/u',$item->title,$matches)){ unset($rss->channel->item[$i]); $i--; $c--; } } echo preg_replace("/\n\n+/", "\n", $rss->asXML()); |
ミソはインデックスの$iとカウント数の$cを一緒に減らしてやる事。
SimpleXMLElementクラスの要素を消すのに「unsetを使え」ってWebに書いてあるのだが、ループさせると思った通りの結果にならない。
上のソースで言うと、itemを消した途端、配列要素の位置がズレるので、ループそのままだと次の項目が現在位置に来て処理されずスキップされるという事だな。
ちなみにforeachで回してkeyでunsetすればいいじゃんと思うかもしれないが、このクラスは変わっていてkeyが常に’item’という値になるので連想配列のキーでは削除できないのだ。
そして、asXML()で出力すると、消した所が空行のまま出力されてしまうので、空行を消して出すという処理にしている。