用于 Twitter 提要的 PHP 类 - 警告:为 foreach() 提供的参数无效


PHP class for Twitter feed - Warning: Invalid argument supplied for foreach() in

我接管了一个网站,他们的Twitter提要有问题。我的PHP知识有限,无法解决这个问题。

以下是他们的提要代码。

我收到多个警告

警告:为 foreach() 提供的参数无效...。在第 105 行等。

为了隐私起见,我删除了作者和屏幕名称。

谁能帮助我或指出我正确的方向?

谢谢

<?php
/**
 * feed.php
 *
 * A parsing and caching class for the Twitter Followers Feed
 *
 * @author ********* September 2013
 * @version  1.0
 * 
 */
class twitterFollowers
{
  /**
   * Array of Twitter data.
   * @access private
   * @var array
   */
    private $data = array();
  /**
   * [$count description]
   * @var integer
   */
  private $count = 1;
  /**
   * [$user_data description]
   * @var boolean
   */
  private $user_data = true;
  /**
   * [$replies description]
   * @var boolean
   */
  private $replies = true;
  /**
   * [$screenName description]
   * @var string
   */
  private $screenName = '*********';
  /**
   * Default construct.
   * Loads up data.
   * @access public
   * @return void
   */
  public function __construct()
  {
    require_once('twitteroauth/twitteroauth.php');
    require_once('config.php');
    $this->loadData();
  }
  /**
   * Fetches data either from cache if the cache file
   * is less than a day old, otherwise the url 
   * is retrieved, parsed and cached
   * @access private
   * @return void
   */
  private function loadData()
  {
    $data = array();
    if ( !$data = get_transient('twitter') ) {
      $connection = $this->getConnectionWithAccessToken(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET);
      $tweets = $connection->get('https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=' . $this->screenName .  '&count=' . $this->count . '&trim_user=0&exclude_replies=1');
      $data = $tweets;
      set_transient('twitter', $data, 3600);
    }
    $this->data = $data;
  }

  public function getConnectionWithAccessToken($cons_key, $cons_secret, $oauth_token, $oauth_token_secret) {
    $connection = new TwitterOAuth($cons_key, $cons_secret, $oauth_token, $oauth_token_secret);
    return $connection;
  }
  /**
   * Returns complete array of data.
   * @access public
   * @return array the data.
   */
  public function getData() {
    return $this->cleanData();
  }
  public function cleanData() {
    $tweets = $this->data;
    $data = array();
    foreach ($tweets as $tweet) {
      $tweetText = $tweet->text;
        foreach($tweet->entities->user_mentions as $user_mention){
          $tweetText = str_replace('@'.$user_mention->screen_name,'<a href="https://twitter.com/'.$user_mention->screen_name.'/" target="_blank"><span class="tweet-entity">@</span>'.$user_mention->screen_name.'</a>',$tweetText);
        }
        foreach($tweet->entities->hashtags as $hashtag){
          $tweetText = str_replace('#'.$hashtag->text,'<a href="https://twitter.com/search/?q=%23'.$hashtag->text.'&src=hash" target="_blank"><span class="tweet-entity">#</span>'.$hashtag->text.'</a>',$tweetText);
        }
        foreach($tweet->entities->urls as $url){
          $tweetText = str_replace($url->url,'<a href="'.$url->expanded_url.'" target="_blank">'.$url->display_url.'</a>',$tweetText);
        }
        if ($tweet->entities->media) {
          foreach($tweet->entities->media as $media){
            $tweetText = str_replace($media->url,'<a href="'.$media->expanded_url.'" target="_blank">'.$media->display_url.'</a>',$tweetText);
          }
        }
        foreach($tweet->entities->symbols as $symbol){
          $tweetText = str_replace('$'.$symbol->text,'<a href="https://twitter.com/search?q=%24'.$symbol->text.'" target="_blank"><span class="tweet-entity">$</span>'.$symbol->text.'</a>',$tweetText);
        }
        $tweetText = nl2br($tweetText);
        $time = $this->get_timeago(strtotime($tweet->created_at));
        $data[] = array(
          'text' => $tweetText, 
          'time' => $time, 
        ); 
    }
    $data['user']['name'] = $tweets[0]->user->name;
    $data['user']['screen_name'] = $tweets[0]->user->screen_name;
    $data['user']['profile_img'] = $tweets[0]->user->profile_image_url;
    return $data;

  }
    /**
   * [get_timeago description]
   * @param  [type] $ptime [description]
   * @return [type]        [description]
   */
  public function get_timeago( $ptime ) {
        $etime = time() - $ptime;
        if( $etime < 1 ) {
            return 'less than 1 second ago';
        }
        $a = array( 12 * 30 * 24 * 60 * 60  =>  'year',
                    30 * 24 * 60 * 60       =>  'month',
                    24 * 60 * 60            =>  'day',
                    60 * 60             =>  'hour',
                    60                  =>  'minute',
                    1                   =>  'second'
        );
        foreach( $a as $secs => $str ) {
            $d = $etime / $secs;
            if( $d >= 1 ) {
                $r = round( $d );
                return $r . ' ' . $str . ( $r > 1 ? 's' : '' ) . ' ago';
            }
        }
    }
}
$twitterFollowers = new twitterFollowers;
$twitter = $twitterFollowers->getData();
date_default_timezone_set('Europe/London'); ?>

在你之前对每个

if (is_array($values) || is_object($values))
{
    foreach ($tweets as $tweet)
    {
        // do stuff
    }
}

听起来不像是Twitter类中的错误。听起来您只是没有检查返回值是否有要循环的内容。

if($tweets){   //..you need to add a check like this..
    foreach($tweets as $tweet){
        echo $tweet;
    }
} else {
    echo 'No tweets found...';
}