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

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2015/02/11 21:59:51
id:yusuke16kyo

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

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

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

ベストアンサー

id:syamaoka No.2

回答回数21ベストアンサー獲得回数9

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;
}, "");
id:yusuke16kyo

PHP の foreach は式ではないので、$message = foreach() {}; という文法は存在しません。

的確な指摘ありがとうございます☆
勉強しているつもりが、まだ全然理解していないと言うことが、わかりました。
具体的なサンプルまで書いて頂き、参考になります。
頑張ってみます。

2015/02/10 01:44:57

その他の回答1件)

id:a-kuma3 No.1

回答回数4973ベストアンサー獲得回数2154

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

他1件のコメントを見る
id:a-kuma3

あ、一件ずつツイートか (^^;

# 目先のことしか見えてない orz

2015/02/09 13:15:17
id:yusuke16kyo

仰る通り基本を勉強しないといけないですね。
勉強したつもりになっているのが、よくわかりました。

頑張ってみます☆

2015/02/10 01:41:31
id:syamaoka No.2

回答回数21ベストアンサー獲得回数9ここでベストアンサー

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;
}, "");
id:yusuke16kyo

PHP の foreach は式ではないので、$message = foreach() {}; という文法は存在しません。

的確な指摘ありがとうございます☆
勉強しているつもりが、まだ全然理解していないと言うことが、わかりました。
具体的なサンプルまで書いて頂き、参考になります。
頑張ってみます。

2015/02/10 01:44:57
id:yusuke16kyo

無事完成しました☆

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

  • id:TransFreeBSD
    「$message = foreach(...)」って構文は何かフレームーワークか何かのですか?
    普通ならエラーになると思いますが。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません