twitter APIで返ってきた配列がリツイートかどうかPHPで判別する


twitter APIで得た情報をリツイートかどうか判別して除外し特定の条件のものだけをデータベースに登録したかった。ひとまずtwitterOAuthあたりでタイムラインを取得してみる。

twitterrequest.php
  //適当にコネクトする部分はググってください。
$TwitterOAuth = new TwitterOAuth($consumerKey,$consumerSecret,$accessToken,$accessTokenSecret);
$request = $TwitterOAuth->get("statuses/home_timeline",array("count" => 50));
 foreach($request as $tweet){
  //ツイートを一つ一つ取り出す
   $text = $tweet->text;
 }

リツイートは配列の中のtextが"RT @~"で始まる。
phpで冒頭に"RT "という文字列を含むかどうかを調べるためにstrposを使った。あとは正規表現くらいしかないっぽい。
strposは指定した文字が文字列の何文字目から始まってるかを返してくれる。
strpos(文字列,指定した文字)
という使い方だそう。
$textがリツイートの場合、RTから始まるため0が帰ってくる。リツイートでない場合、RTという文字列を含んでいなければbool(false)が、含んでいれば何文字目で始まるかの数字が返ってくるため、bool(false)の時、としてしまうとエラーが起きそう。
そのため「!(エクスクラメーション)」を使ってIF文で判別しようと思い、比較演算子を使ってboolがどういう挙動をするかを実験。結果は以下。

withRT.php
//取り出したテキストがリツーイトの場合
    $text ="RT @Qiita:…<br>";
    $finder   = "RT ";
    $pos = strpos($text, $finder);//var_dump($pos)するとint(0)が返ってくる

    var_dump($pos===0);//bool(true) 
    var_dump(!$pos===0);//bool(false) 
    var_dump($pos!==0);//bool(false)
withoutRT.php
//テキストがリツイートじゃない場合
    $text ="@qiita:…<br>";
    $finder   = "RT ";
    $pos = strpos($text, $finder); //var_dump($pos)がだいたいbool(false)になる

    var_dump($pos===0);//bool(false) 
    var_dump(!$pos===0);//bool(false) 
    var_dump($pos!==0);//bool(true)

 というわけで!$pos===0の挙動が予想と違ったので、

if($pos !==0){
//リツイートじゃない場合の処理
}

と書けばリツイートを除外できるっぽい。