【问题标题】:How to execute multiple functions with many different twitter users without duplicating code?如何在不重复代码的情况下与许多不同的 Twitter 用户一起执行多个功能?
【发布时间】:2012-12-02 22:05:39
【问题描述】:

我正在使用 Twitter API 1.1 制作一个 wep 应用程序,并且已经成功创建了一些函数,这些函数可以提取指定的用户个人资料图像、他们的实际姓名和他们的最新推文。全部使用 OAuth 对请求进行身份验证。

我的问题是 - 创建的所有 3 个函数都需要定义一个 twitter 用户名。目前,我必须为我输入的每个 Twitter 用户名一遍又一遍地复制我的代码。肯定有更好的方法吗?目前我的代码看起来一点也不好看。如果有人可以提供帮助,我将不胜感激。我对 PHP 还很陌生,所以一直坚持要做什么。

请在下面查看我的代码: 功能:

function getTweets($user, $tmhOAuth){
$usertweets = array();

$code = $tmhOAuth->request('GET', $tmhOAuth->url('1.1/statuses/user_timeline'), array(
  'include_entities'    => '1',
  'include_rts'         => '1',
  'screen_name'         => $user,
  'count'               => 1,
  'exclude_replies'     => 'true',
  'contributor_details' => 'true'
));


if ($code == 200) {
  $timeline = json_decode($tmhOAuth->response['response'], true); 
  foreach ($timeline as $tweet) :
    $entified_tweet = tmhUtilities::entify_with_options($tweet);
    $is_retweet = isset($tweet['retweeted_status']);

    $diff = time() - strtotime($tweet['created_at']);
    if ($diff < 60*60)
      $created_at = floor($diff/60) . ' minutes ago';
    elseif ($diff < 60*60*24)
      $created_at = floor($diff/(60*60)) . ' hours ago';
    else
      $created_at = date('d M', strtotime($tweet['created_at']));

    $permalink  = str_replace(
      array(
        '%screen_name%',
        '%id%',
        '%created_at%'
      ),
      array(
        $tweet['user']['screen_name'],
        $tweet['id_str'],
        $created_at,
      ),
      '<a href="https://twitter.com/%screen_name%/%id%">%created_at%</a>'
    );
     $tweet['created_at'] = $created_at;
     $usertweets[] = $tweet;
   endforeach;
   } else {
       tmhUtilities::pr($tmhOAuth->response);
}
    return $usertweets;
}

function getImage($screen_name,$tmhOAuth,$size = ''){
$url = $tmhOAuth->request('GET', $tmhOAuth->url('1.1/users/show'), array(
  'screen_name' => $screen_name,
));

$results = json_decode($tmhOAuth->response['response'], true);

//Get the user's profile image
$profileImg = ($results['profile_image_url']);
return str_replace('_normal', $size, $profileImg);
}

function getName($screen_name,$tmhOAuth){
$url = $tmhOAuth->request('GET', $tmhOAuth->url('1.1/users/show'), array(
  'screen_name' => $screen_name,
));

$results = json_decode($tmhOAuth->response['response'], true);

//Get the user's name
$name = ($results['name']);
return $name;
}

功能是如何实现的:

$name2 = getName("JoeyEssex_",$tmhOAuth);
$user2 = getTweets("JoeyEssex_",$tmhOAuth);
$image2 = getImage("JoeyEssex_",$tmhOAuth);

$name3 = getName("piersmorgan",$tmhOAuth);
$user3 = getTweets("piersmorgan",$tmhOAuth);
$image3 = getImage("piersmorgan",$tmhOAuth);

$name4 = getName("BinkyFelstead",$tmhOAuth);
$user4 = getTweets("BinkyFelstead",$tmhOAuth);
$image4 = getImage("BinkyFelstead",$tmhOAuth);

//Display the profile images of specified users

echo '<img src="' . $image2 . '" width="240px" height="240px" />';
echo '<img src="' . $image3 . '" width="240px" height="240px" />';
echo '<img src="' . $image4 . '" width="240px" height="240px" />';

//Display user's name
echo '<p>Latest tweet from <b>' . $name1 . '</b>:<br />';
//Display their tweets
foreach($user1 as $tweet){ 
echo $tweet['text'] . '<br />';
echo "Sent: <b>" . $tweet['created_at'] . "</b></p>";
}

echo '<b>' . $name2 . '</b>&nbsp;';
foreach($user2 as $tweet){
echo $tweet['text'];
echo "&nbsp;" . $tweet['created_at'] . "<br />";
}

echo '<b>' . $name3 . '</b>&nbsp;';
foreach($user3 as $tweet){
echo $tweet['text'];
echo "&nbsp;" . $tweet['created_at'] . "<br />";
}

echo '<b>' . $name4 . '</b>&nbsp;';
foreach($user4 as $tweet){
echo $tweet['text'];
echo "&nbsp;" . $tweet['created_at'] . "<br />";
}

你看到可怕的重复了吗?一定有更好的方法!

【问题讨论】:

  • 你的问题是?为什么你不能用更好的方式来写它?你在哪里撞墙了?您在寻找数组吗? php.net/array
  • @hakre 我肯定碰壁了!请你能给我举个例子来说明你的意思吗?就像我说的我对 PHP 很陌生,所以我不确定数组会有什么帮助?
  • 数组是变量的列表/集合,所以你有 $name[0]$name[$n] 而不是 $name1$nameN。因此,您可以创建一个名称数组,然后在循环中运行函数调用。那是基本的编程,只是独立于编程语言。大多数编程语言都有循环,还有列表/集合/数组。 php.net/foreach
  • 非常感谢@hakre。我真的可以用上面使用的代码做一个例子吗?在学习正确的 php 方法方面,我显然错过了一个重要的空白,没有一个例子,我就是不明白。 :(

标签: php twitter twitter-oauth


【解决方案1】:

重复代码中唯一不同的部分实际上是发推文的人的姓名。因此,创建一个所有高音扬声器名称的列表并对其进行迭代。更改foreach 循环内的代码以反映新的输入和处理:

$tweeters = array('JoeyEssex_', 'piersmorgan', 'BinkyFelstead');

foreach ($tweeters as $tweeter)
{
    $tweeter_name   = getName($tweeter, $tmhOAuth);
    $tweeter_tweets = getTweets($tweeter, $tmhOAuth);
    $tweeter_image  = getImage($tweeter, $tmhOAuth);    

    // Display the profile images of user
    echo '<img src="' . $tweeter_image . '" width="240px" height="240px" />';

    // Display user's name
    echo '<p>Latest tweet from <b>' . tweeter_name . '</b>:<br />';

    // Display user's tweets
    foreach ($tweeter_tweets as $tweet)
    {
        echo $tweet['text'] . '<br />';
        echo "Sent: <b>" . $tweet['created_at'] . "</b></p>";
    }
}

将重复放入循环是表达代码重复的常用方式,意思是一遍又一遍地做同样的事情。

此外,您甚至可以开始将功能包装到 Tweeter 类中:

class Tweeter {

    private $name;
    private $tmhOAuth;

    public function __construct($name, $tmhOAuth) {
        $this->name     = $name;
        $this->tmhOAuth = $tmhOAuth;
    }

    public function getName() {
        return getName($this->name, $this->tmhOAuth);
    }

    public function getTweets() {
        return getTweets($this->name, $this->tmhOAuth);
    }

    public function getImage() {
        return getImage($this->name, $this->tmhOAuth);
    }
}

这写得很快,当然你甚至可以将代码从现有的get... 函数移到类方法中,但我保持它一步一步快速地进行第一次更改而不删除现有代码。

那么用法就相当简单了:

$tweeters = array('JoeyEssex_', 'piersmorgan', 'BinkyFelstead');

// Create all Tweeter objects
foreach ($tweeters as $i => $tweeter)
{
    $tweeters[$i] = new Tweeter($tweeter, $tmhOAuth);
}

// Display all Tweeters

foreach ($tweeters as $tweeter)
{
    echo '<img src="' . $tweeter->getImage() . '" width="240px" height="240px" />';

    echo '<p>Latest tweet from <b>' . $tweeter->getName() . '</b>:<br />';

    foreach ($tweeter->getTweets() as $tweet)
    {
        echo $tweet['text'] . '<br />';
        echo "Sent: <b>" . $tweet['created_at'] . "</b></p>";
    }
}

这将使您开始从面向对象编程中获利。

【讨论】:

  • 这让加载更有意义!我会试一试,让你知道我的进展如何。谢谢你帮我看到了光明!
  • Hakre,非常感谢您!我已经成功地实现了它,并且我已经将以前的函数移到了类方法中并且它工作得很好。使用使用“foreach”循环在每个高音扬声器的函数中循环的代码,当点击高音扬声器的个人资料图像时,我将如何做到这一点,他们的推文出现在灯箱中?我可以使用 jQuery 自己创建灯箱和所有内容,但我如何才能将每个推特用户的个人资料图像分配给他们独特的推文?使用您在上面提供的代码。很抱歉所有的问题,你是一个很大的帮助!
  • 我刚刚试了一下,所有推文都出现在灯箱中,而不是每条推文都依赖于点击的个人资料图片。对我上述评论的任何帮助将不胜感激!
  • 您是否需要 100% 与问题中相同的输出顺序(首先是所有图像),然后是每个用户的所有推文?如果是这样,那么对 Tweeter 对象进行两次 foreachs。首先显示所有图像,然后在第二个 foreach 显示推文。我不是 100% 确定我理解正确,所以希望这仍然有帮助;)
  • 嗨,Hakre,顺序真的不重要。我想要实现的是一个应用程序,用户可以在其中添加 twitter 帐户(在本例中是数组中的帐户 - piers morgan 等),然后该应用程序显示添加的帐户的所有个人资料图像。然后可以单击每个个人资料图像,显示他们的最新推文。例如 - 我将 Piers Morgan 添加到应用程序,然后从 Twitter 中提取他的个人资料图像。当我点击他的个人资料图片时,我可以看到他在推特上发布的内容。我希望此功能可用于添加到阵列的任何帐户。这有帮助吗?
猜你喜欢
  • 2012-05-02
  • 1970-01-01
  • 2010-10-18
  • 2021-09-11
  • 1970-01-01
  • 1970-01-01
  • 2014-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多