添え字の値@配列中のXML解析

引き続きHTMLScrapingのサンプルスクリプトHTMLToFeed.class.phpです。


少しづつスクレイピングのコツがわかってきた気がします。
htmlからRSSにまでできればこっちのもの!だしね〜


ほんと、HTMLScrapingの作者さんに感謝感謝です。


HTMLToFeed.class.phpのサンプルHTMLは、以下のようにliタグの中で、URL、タイトル、日付が1対1の素直な関係になっています。


今回は、そうでない場合の対処法を検討したいと思います。


しかし、今私が試みている対象は以下のようなHTML。

MM/DDの更新

MM/DDの更新


日付とliタグが1対1でない、urlとタイトルが1対1でないという構成になっています。面倒くさい。


せめて日付がliタグの中にあれば楽なのに(><。。。
幸い、liの出てくる順番とh4の出てくる順番は一緒(*番目のh4で囲われている日付は、*番目のliの要素の更新日)なので、これを手がかりに日付とliの要素を関連づけることにします。
ということで、foreachで回すときに、現在のポインタ位置の添え字の値(正しいいい方がわかりません^^;;)を調べなければいけません。


しかし、知りたいことは大抵マニュアルに書いてありますね。
問題は読んだときに意味がわかっていないことに後で気付くことなんですが(^^;)

foreach (array_expression as $key => $value)
各ループで現在の要素のキーが変数 $keyに代入される


PHP: foreach - Manual
 http://jp.php.net/manual/ja/control-structures.foreach.php


ってことは、

<?php
$color1 = array(0 => "red ", 1 => "green", 2 => "blue");
$color2 = array(0 => "", 1 => "", 2 => "");

foreach($color1 as $key => $val)
{
echo "現在の添え字は ". $key . "<br/>";
echo "現在の要素は ". $val . "<br/>";
echo "$color2[$key]<br/><br/>";
}
?>

(参考)
▽配列の要素を表示しない(教えて!goo
 http://oshiete1.goo.ne.jp/qa2958033.html


と書くと、

現在の添え字は 0
現在の要素は red

現在の添え字は 1
現在の要素は green

現在の添え字は 2
現在の要素は blue


という結果を得られるわけです(やってみた)。


しかし、これをもとに

<?php
// (中略)
      // ▽ul:日付ごとに処理を行います
      foreach ($ul_elements as $key => $ul) {

        // pubDateのデータを作成
      $pubdate_year = date("Y"); //当月の履歴しか表示しない仕様ぽいので手抜き
      $pubdate_mday = $xml->body->table[0]->tr->td[1]->div[1]->h4[$key];

        if (preg_match('|(\d{1,2})/(\d{1,2})|s', $pubdate_mday, $matches)) {
           $pubDate = strtotime("{$pubdate_year}-$matches[1]-$matches[2]");
        }
// (中略)
?>


とか書いても、$keyに値が入らない。
……そもそもちゃんと動かない原因がこれと気付くまで大変だったさ。


なまじ上でわざわざテストして、似たような文法で動いていたものだから。
どうすればいいんだろう?と悩んでからも長かったです。

単純な連想配列じゃないのがXMLのツリーだから、nodeNameか何かで持ってこないと表示できない


▽添え字が表示できない (MSN相談箱)
 http://questionbox.jp.msn.com/qa3725013.html


へー。別に変数を用意しないといけないというのが結論のようです。
なんでかわかんないけど……イテレータなるものを学べばわかるんでしょうか。


とりあえずわかっても問題は解決するわけじゃないようなので、学ぶのは先送りにします。