知識を貸していただければと思います。
<?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の繰り返しの部分が問題あるのでしょうか?
コードの書き方など、悪いとは思いますが、よろしくお願いいたします。
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; }, "");
$message = foreach(…)はAPIから返ってきたレスポンスを一つずつ取り出しているのですが、やはりここに問題ありますよね?
$messageに適当にテキストを代入させれば、ツイートはされるので、仰ってる部分がエラーの原因だとおもうのですが、この部分(APIにリクエストして、レスポンスから一つずつ取り出してツイートする)を、どのようにコードを書けばいいのか悩んでいます。
知識を貸していただきたいと、思っています。
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
無事完成しました☆
回答していただき、誠にありがとうございます。
普通ならエラーになると思いますが。