2012-12-02 32 views
1

我正在使用Twitter API 1.1製作一個wep應用程序,併成功創建了引入指定用戶配置文件圖像,其實際名稱和最新推文的函數。全部使用OAuth來驗證請求。如何在不復制代碼的情況下使用許多不同的twitter用戶執行多個功能?

我的問題是這個 - 創建的所有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 />"; 
} 

你看到可怕的重複?有一個更好的方法!

+0

而你的問題是?你爲什麼不能用更好的方式寫出來?你打到了哪裏?你在尋找數組嗎? http://php.net/array – hakre

+0

@hakre我肯定已經撞到了牆上!請你能爲我提供一個你的意思嗎?就像我說的,我對PHP很新,所以我不確定數組如何提供幫助? – Tom

+0

數組是一個變量的列表/集合,所以''name1'到'$ nameN'不是'$ name [0]',而是'$ name [$ n]'。所以你可以創建一個名稱數組,然後在循環中運行函數調用。這是基本的編程,只是獨立於編程語言。大多數編程語言都有循環和列表/集合/數組。 http://php.net/foreach – hakre

回答

0

重複代碼中唯一不同的部分實際上是發送人的姓名。因此,創建一個所有推文名稱的列表並迭代它。更改代碼的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>"; 
    } 
} 

這將使你開始從面向對象編程中獲利。

+0

這使得負載更有意義!我會給它一個去,讓你知道我怎麼得到。謝謝你幫助我看到光! – Tom

+0

Hakre,非常感謝你!我設法實現它成功地將前面的函數移到了類方法中,並且完美地工作。通過使用'foreach'循環遍歷每個高音揚聲器的函數的代碼,我怎樣才能做到這一點,當點擊tweeters配置文件圖像時,它們的鳴叫出現在燈箱中?我能夠使用jQuery創建燈箱和所有內容,但是如何製作它,以便每個tweeters個人資料圖像都分配給其獨特的推文?使用上面提供的代碼。對所有問題抱歉,你是一個很好的幫助! – Tom

+0

我剛給它一個去,所有的推文都出現在燈箱中,而不是每個單獨的推文依賴於點擊的配置文件圖像。任何幫助我上面的評論將不勝感激! – Tom

相關問題