マッシュアップに行き詰る、が『解決』
2008年02月03日17:09
ZAPA先生のマッシュアップ講座の第4回をやっていたのですが、紹介されている方法では、simplexml_load_file関数が使ってあるので、PHP4では動きません。

できたらPHP4でも動かしたいと思い、前回の記事で使ったXML_Unserializerを使って色々と試してみました。

var_dump関数で見ると、どうやら配列まではできているみたいなのですが、それをどう利用していいのかがわかりません。

どなたか詳しい方、教えていただけないでしょうか。

<作ったコード>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>フォト蔵</title>
<style type="text/css">
<!--
body {
font-size: 14px;
}
-->
</style>
</head>
<body>
<?php
function photozou($keyword,$limit){
$req = "http://api.photozou.jp/rest/search_public";
$req .= "?type=photo&keyword=".urlencode($keyword)."&limit=".$limit;


require_once("XML/Unserializer.php");
$xml_data = file_get_contents($req);
$parser = new XML_Unserializer(array(’parseAttributes’ => true));
$parser->unserialize($xml_data);
$XML = $parser->getUnserializedData();

var_dump($XML);
}
$keyword = "エヴァンゲリオン";
$limit = "5";
echo photozou($keyword,$limit);
?>
</body>
</html>



実行結果 → http://syoboi.com/test/photozou.php


出来上がっている配列$XMLの構造はなんとなくわかるのですが、データを取り出せないで行き詰っています。

今までと比べて、配列の構造が少し複雑なのですよね・・・


<試してみた事>

1.echo $XML['info']['photo']['photo_title'];とか書いても、何も表示されない。

2.foreachを使ってあれこれ試行錯誤してみたのですが、これもやり方がわからない。

3.PEARのライブラリ、XML_RSSも使ってみたがエラーになる。


XML_Unserializerを使って、ZAPA先生のマッシュアップ講座の第4回と同じ結果を出すには、この先どうしたら良いんでしょうか。


詳しい方、何卒教えてくださいませ。

よろしくお願い致します。




m(_ _)m



<追記>

コメントでやすたろ〜さまより配列の要素の取り出し方を教えて頂きました。
やすたろ〜さま、本当にありがとうございました。
m(_ _)m

foreachを使って何とかできないかと悩んでおりましたが、挫折。
for文で、一応、取り出したいものを取り出すことに成功しました。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>フォト蔵</title>
<style type="text/css">
<!--
body {
font-size: 14px;
}
-->
</style>
</head>
<body>
<?php
function photozou($keyword,$limit){
$req = "http://api.photozou.jp/rest/search_public";
$req .= "?type=photo&keyword=".urlencode($keyword)."&limit=".$limit;


require_once("XML/Unserializer.php");
$xml_data = file_get_contents($req);
$parser = new XML_Unserializer(array(’parseAttributes’ => true));
$parser->unserialize($xml_data);
$XML = $parser->getUnserializedData();

$ret = '<div class="photozou">';
for($i = 0; $i < $limit; $i++){
$ret .= "<a href=¥"".$XML['info']['photo'][$i]['url']."¥">";
$ret .= "<img src=¥"".$XML['info']['photo'][$i]['thumbnail_image_url']."¥" alt=¥"".$XML['info']['photo'][$i]['photo_title']."¥">";
$ret .= "</a>¥n";
}
$ret .= "</div>";
return $ret;
}
$keyword = "エヴァンゲリオン";
$limit = "5";
echo photozou($keyword,$limit);
?>
</body>
</html>



出来上がったもの → http://syoboi.com/test/photozou2.php

limitの数より写真が少ない場合、エラーになりそうな予感。
foreachで処理できる方法がわかる方いらっしゃいましたら、引き続きコメントをお待ちしています。


でも、foreachが使えなくても、完成できて嬉しいです!
やすたろ〜さま、サンクス!!!


<さらに追記>

コメントで、再びやすたろ〜さまから教えていただきました。
for文のカウンタを$limitから、count($XML['info']['photo'])に変えました。

これで$limitよりphotoの数が少なくてもエラーは出ないと思います。

本当に、やすたろ〜さま。重ね重ねありがとうございました。
なんとか次に進む事ができ、そろそろマッシュアップサイトが作れそうな予感がしてきました。

嬉しいです!


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>フォト蔵</title>
<style type="text/css">
<!--
body {
font-size: 14px;
}
-->
</style>
</head>
<body>
<?php
function photozou($keyword,$limit){
$req = "http://api.photozou.jp/rest/search_public";
$req .= "?type=photo&keyword=".urlencode($keyword)."&limit=".$limit;


require_once("XML/Unserializer.php");
$xml_data = file_get_contents($req);
$parser = new XML_Unserializer(array(’parseAttributes’ => true));
$parser->unserialize($xml_data);
$XML = $parser->getUnserializedData();

$ret = '<div class="photozou">';
for($i = 0; $i < count($XML['info']['photo']); $i++){
$ret .= "<a href=¥"".$XML['info']['photo'][$i]['url']."¥">";
$ret .= "<img src=¥"".$XML['info']['photo'][$i]['thumbnail_image_url']."¥" alt=¥"".$XML['info']['photo'][$i]['photo_title']."¥">";
$ret .= "</a>¥n";
}
$ret .= "</div>";
return $ret;
}
$keyword = "エヴァンゲリオン";
$limit = "5";
echo photozou($keyword,$limit);
?>
</body>
</html>





clip!PHP 

この記事へのコメント
やすたろ〜
やすたろ〜
2008年02月03日 19:23
1は
echo $XML['info']['photo'][0]['photo_title'];
のように、間に何番目なのかを入れる必要があります。

2が出来なかったのもそれが関係あると思います。

afiliate
どおも〜、やすたろ〜さま。

ご丁寧に教えてくださって、ありがとうございます!
おかげさまで、目的の処理ができました。
嬉しいです!!
早速、追記させていただきました。

できればforeach文を使いたいので、もうちょっと試行錯誤してみたいと思います。

本当にありがとうございました。
m(_ _)m

やすたろ〜
やすたろ〜
2008年02月04日 01:29
foreachでのやり方は分かりませんが、
limitに入力する値は
count($XML['info']['photo'])
で取り出せると思います。
とりあえずそれでエラーは防げます。

afiliate
どおも〜やすたろ〜さま。

マジ、完・璧・で・す・!

count($XML['info']['photo'])で、できましたよ。
本当にありがとうございます。
おかげさまで、なんとなく深い階層の配列も扱えるようになりました。
次回、動画編でも使わせていただきたいと思います。

本当にありがとうございました!!