2009年5月14日木曜日

グーグルカレンダーの要素を抜き出しソートして表示するPHP

2010/02/05 RSSがバージョンしたので、内容を変更しました。こちらをどうぞ!

**************************************

PHP XML Library を使って抜き出すのは簡単にできるのだが順番にできなかったので挑戦!

XMLLibrary.php のソースはこちらです

またまたPHP pro で教えてもらって完成した!
以前も作っていたのですが、日付の要素でちゃんとソートできるというのを追加したいと思ってから12日。
教えてもらってわかったことは、私しゃarray();をまだまだ使いこなせてないってこと。

これは経験なんだろうなと。 あ~。道険しぃ。


<?php
error_reporting(1);
require('XMLLibrary.php');
$data = file_get_contents("http://www.google.com/calendar/feeds/yumisaiki@gmail.com/public/basic");
$array = XML_unserialize($data);

$entry = $array['feed']['entry'];
mb_convert_variables('EUC-JP','UTF-8', $entry);


// 最初の要素で配列を作る じゃないと格納する場所がない
$datas = array(); //これをIDとして使いソートする
$cont[0]['title'] = $entry[0]['title'];
$cont[0]['link'] = $entry[0]['link']['0 attr']['href'];
$cont[0]['content'] = mb_strimwidth($entry[0]['summary'],5,30);
$datas[0] = $cont[0]['content'];


//print_r ($cont)."<br/>"; //これを出力すると$cont にきれいにkey=> 内容に入っていることがわかる。 $dataは関係ないけど数値がいっしょになる。

$count = 6;
// 2番目から6番目まで要素を取り出しながら配列に追加
for($i=1; $i<$count; $i++){
$cont[$i]['title']=$entry[$i]['title'];
$cont[$i]['content']=mb_strimwidth($entry[$i]['summary'],5,30);
// push関数を用いて 要素を追加することで配列が増える これにより$contの内容も増やせる
array_push($datas,$cont[$i]['content']);
$cont[$i]['link'] = $entry[$i]['link']['0 attr']['href'];
}

//今日より以前のものは消す
$today = date("Y/m/d"); //基準となる今日 ex2009/05/14

foreach($datas as $i => $s) {
/* 前後の半角スペースを削除 */
$s = trim($s);
/* 最初の半角スペースまでを取得(年月日だけ取得) */
$s = substr($s , 0, strpos(trim($s), ' '));
/* 年月日を数値化して、基準日より小さければ */
if (strtotime($s) < strtotime($today)) {
/* 配列から削除する */
unset($datas[$i]);
}
}

asort( $datas ); //$datasで並べ替え


//$datas を使ってIDでつながった$cont の内容を印刷する
foreach ($datas as $key => $value) {
print <<<ENTRY_PEINT
<p class="m"><a href="#" onclick="window.open('{$cont[$key][ 'link' ]}','javascript_1','height=250,width=700,resizable');">{$cont[$key]['title']}</a><br/>{$cont[$key]['content']}…</p>n
ENTRY_PEINT;
}

?>

出力はEUC-JP になるので、utf-8 にするのは、最後に
mb_convert_variables('UTF-8','EUC-JP',$cont); とかしないといけない。
なぜか日時はutf-8でないとうまく抜けません。
出力の工夫で携帯サイトなどに活用できます。

尚、もしかしたらカレンダーの内容によって抜き出しの部分が違うかもしれません。下記のプログラムを使うと構造が分析できます。ムーチョさんありがとうございます!!


<?php
//XMLLibrary.phpという名前で、紹介したソースを保存した場合
require('XMLLibrary.php');

//これは文字エンコード用の仮関数
function array2encode($array, $toEncode, $fromEncode=null)
{
if (!$fromEncode) {
$fromEncode = 'auto'; //できるだけ使わないようにして、第3引数を渡す
}
if (is_array($array)) {
foreach ($array as $key => $value) {
$result[$key] = array2encode($value, $toEncode, $fromEncode);
}
} else {
$result = mb_convert_encoding($array, $toEncode, $fromEncode);
}
return $result;
}

$data = file_get_contents("http://www.google.com/calendar/feeds/1qkkqtv5eo3jimiidbltonpi1s%40group.calendar.google.com/public/basic");
$array = XML_unserialize($data);

// 一応、すべての内容にエンコードをかけておく
$array2 = array2encode($array, 'sjis', 'utf8');
echo '<pre>';
print_r($array2);
echo '</pre>';

?>




でも、こんな*書類が作成された順に、ブリーフケースに入れる*方法があるとは…。知りませんでした。
連想配列の例って、単純なものしかないので、実際の使い方がよくわからなかったのですが、
これが本来の使い方ではないだろうか。
連想配列に入れるのに最初に配列を作っておくというのはわかるけど、他の変数を使うことでソートするというのは思いつかない。

$briefcase = $papers というのを入れるべきなのかもしれないが、なくても動いた。 

本当は書いてあるとおりにmktimeとかしたほうがいいんだろうけど。うまくいかなかった。(手抜き)

それにしても‥いいこと教えてもらいました。(もうちょっと最初に教えてほしかったけど…お陰でストレスたまった‥まぁ。勉強にはムチャクチャなりました。ありがとうございました。)

お問合せフォーム

お名前 :
Email: (必須)
メッセージ: (必須)

 約束しないと、送信できません。再度の場合はリロードが必要です。


0 コメント :

コメントを投稿

コメントありがとうございます。


サイト内検索


View My Stats