人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

APIにリクエストしてレスポンスが返ってきている状態です。この結果を一件ずつ取得してTwitterbotでツイートさせたいのですが、うまくいきません。
知識を貸していただければと思います。

<?php
$xml=simplexml_load_file($url);
$hits=$xml->Items->Item;

$message = foreach($hits as $hit)
{
<a href="print h($hit->Url);">print h($hit->itemName);</a><br />
print number_format(h($hit->itemPrice));円<br />
print h($hit->itemCaption);<br />
<a href="print h($hit->shopUrl);">print h($hit->shopName);</a><br />
}

$turl = "https://api.twitter.com/1.1/statuses/update.json";
$method = "POST";

//OAuthオブジェクト生成
$to = new TwitterOAuth($consumer_key,$consumer_secret,$access_token,$access_token_secret);

//投稿
$req = $to->OAuthRequest($turl,$method,array("status"=>$message));

//Twitterから返されたJSONをデコードする
$result = json_decode($req);

//JSON配列の結果を表示する
print "<pre>";
var_dump($result);
?>

$messageの繰り返しの部分が問題あるのでしょうか?
コードの書き方など、悪いとは思いますが、よろしくお願いいたします。

●質問者: yusuke16kyo
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

質問者から

$message = foreach(…)はAPIから返ってきたレスポンスを一つずつ取り出しているのですが、やはりここに問題ありますよね?

$messageに適当にテキストを代入させれば、ツイートはされるので、仰ってる部分がエラーの原因だとおもうのですが、この部分(APIにリクエストして、レスポンスから一つずつ取り出してツイートする)を、どのようにコードを書けばいいのか悩んでいます。

知識を貸していただきたいと、思っています。


1 ● a-kuma3

CakePHP を使ってるんでしょうか。
h() 関数って、定義されてます?
h() 関数が定義されてるとして(かなり怪しい)、foreach の部分だけですが、以下のようなコードになるはずです。

<?php
 ...

 $message = "";
 foreach($hits as $hit)
 {
 $message .= '<a href="' . h($hit->Url) . '">' . h($hit->itemName) . '</a><br />';
 $message .= number_format(h($hit->itemPrice)) . '円<br />';
 $message .= h($hit->itemCaption) . '<br />';
 $message .= '<a href="' . h($hit->shopUrl) . '">' . h($hit->shopName) . '</a><br />';
 } 

 ...
?>

ググったコードのコピペも良いですけど、PHP の基本的な文法を勉強した方が良いと思います。
# 因みにぼくは、他人に「基本的な文法を勉強した方が良い」と言えるほど、PHP のことを分かってないです :-)
http://php.net/manual/ja/language.operators.string.php


TransFreeBSDさんのコメント
私もPHPは怪しいのでコメントしてみた次第。 ほかにもforeachとかだと全件つぶやくんじゃない?とか HTMLってつぶやけるんだっけ?とか 新しいのだけ?古いのもつぶやいていい?順番は?とか なかなかありそうな気が。

a-kuma3さんのコメント
あ、一件ずつツイートか (^^; # 目先のことしか見えてない orz

yusuke16kyoさんのコメント
仰る通り基本を勉強しないといけないですね。 勉強したつもりになっているのが、よくわかりました。 頑張ってみます☆

2 ● syamaoka
ベストアンサー

PHP の foreach は式ではないので、$message = foreach() {}; という文法は存在しません。以下のように foreach で $message に文字列を追加していくコードにすれば要求を満たせると思います。

<?php
$turl = "https://api.twitter.com/1.1/statuses/update.json";
$method = "POST";

//OAuthオブジェクト生成
$to = new TwitterOAuth($consumer_key,$consumer_secret,$access_token,$access_token_secret);

$xml = simplexml_load_file($url);
$hits = $xml->Items->Item;

foreach ($hits as $hit) {
 $message = "";
 $message .= sprintf('<a href="%s">%s</a><br />', h($hit->Url), h($hit->itemName));
 $message .= sprintf('%s円<br />', h(number_format($hit->itemPrice)));
 $message .= sprintf('%s<br />', h($hit->itemCaption));
 $message .= sprintf('<a href="%s">%s</a><br />', h($hit->shopUrl), h($hit->shopName));

 //投稿
 $req = $to->OAuthRequest($turl, $method, array("status" => $message));

 //Twitterから返されたJSONをデコードする
 $result = json_decode($req);

 //JSON配列の結果を表示する
 print "<pre>";
 var_dump($result);
}

あるいは、元のコードのように結果を一度に取得したいのであれば、以下の書き方もできます。関数型言語では頻繁に使われるコーディング技法ですが、PHP ではあまり見ない書き方です。

<?php
function h($s) { return $s; }

$hits = [
 (object)[
 'Url' => 'http://localhost/',
 'itemUrl' => '',
 'itemPrice' => 0,
 'itemCaption' => '',
 'itemName' => '',
 'shopUrl' => '',
 'shopName' => '',
 ]
];
$message = array_reduce($hits, function($message, $hit) {
 $message .= sprintf('<a href="%s">%s</a><br />', h($hit->Url), h($hit->itemName));
 $message .= sprintf('%s円<br />', h(number_format($hit->itemPrice)));
 $message .= sprintf('%s<br />', h($hit->itemCaption));
 $message .= sprintf('<a href="%s">%s</a><br />', h($hit->shopUrl), h($hit->shopName));
 return $message;
}, "");

yusuke16kyoさんのコメント
PHP の foreach は式ではないので、$message = foreach() {}; という文法は存在しません。 ↑ 的確な指摘ありがとうございます☆ 勉強しているつもりが、まだ全然理解していないと言うことが、わかりました。 具体的なサンプルまで書いて頂き、参考になります。 頑張ってみます。

質問者から

無事完成しました☆
回答していただき、誠にありがとうございます。


関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ