如何以相反的顺序从数组发送twitter消息?

时间:2013-09-06 10:51:32

标签: php arrays twitter

我正在使用以下代码将长消息拆分为多条短消息。 反转发送顺序的最简单方法是什么,所以最后一条消息先发送?

(邮件应按此顺序3>2>1而非当前1>2>3发送)

function split_to_chunks($to,$text){
    $total_length = (137 - strlen($to));
    $text_arr = explode(" ",$text);
    $i=0;
    $message[0]="";
    foreach ($text_arr as $word){
        if ( strlen($message[$i] . $word . ' ') <= $total_length ){
            if ($text_arr[count($text_arr)-1] == $word){
                $message[$i] .= $word;
            } else {
                $message[$i] .= $word . ' ';
            }
        } else {
            $i++;
            if ($text_arr[count($text_arr)-1] == $word){
                $message[$i] = $word;
            } else {
                $message[$i] = $word . ' ';
            }
        }
    }


$length = count($message);

for ($i = 0; $i < $length; $i++) {
    if($i < $length-1){
$status = new Tweet();
$status->set($message[$i]."...");
  } else {
$status = new Tweet();
$status->set($message[$i]);
}
  }
}

2 个答案:

答案 0 :(得分:5)

array_reverse循环

之前使用foreach

函数array_reverse允许您在执行$message循环之前撤消for数组(为什么不是foreach?看起来你正在查看所有内容反正)。

此代码的简单重构

首先,您的代码应该是两个函数,因为它执行两个相当不相关的任务。如果你想让一个包装函数同时调用它们,那么一定要这样做。

所以,这是将输入文本分成推文的功能:

// This function will separate an arbitrary length input text into 137 or less chatracter tweets.
function separateTextIntoTweets($input, $reversed = true) {

    // Remove line breaks from input, then allocate to an array
    $input = trim(preg_replace('/\s\s+/', ' ', $input));
    $text_arr = explode(" ", $input);

    $tweets  = array();
    $tweet = "";

    // Using a while loop, we can check the length of $text_arr on each iteration
    while(!empty($text_arr)) {
        // Take first word out of the array
        $word = array_shift($text_arr);
        if(strlen($tweet) + strlen($word) < 137) { // Fits in this tweet
            $tweet .= " $word";
        } else { // Does not fit in this tweet
            $tweets[] = trim($tweet);
            $tweet    = $word;
        }
    }

    // If there's a leftover tweet, add it to the array
    if(!empty($tweet)) $tweets[] = $tweet;

    // Return tweets in the reversed order unless $reversed is false
    return ($reversed) ? array_reverse($tweets) : $tweets;
}

Live demonstration of this

这是发送多部分推文的功能,除了数组中的最终推文外,还附加'...':

// This function sends tweets, appending '...' to continue
function sendTweets($tweets) {
    foreach($tweets as &$tweet) {
        $status = new Tweet();
        $tweet = ($tweet == end($tweets)) ? $tweet : $tweet . "...";
        $status->set($tweet);
    }
}

我设计了此项,因此您可以直接在sendTweets的输出上调用separateTextIntoTweets以获得所需的结果。

对标准功能较少的一些解释

如果需要,我的代码中不太明显的部分的解释:

&$tweet                             
    - Passes $tweet by reference so that it can be modified to append '...'
$tweet = ($tweet == end($tweets)) ? $tweet : $tweet . "..."                      
    - Conditional ternary operator, this is shorthand for:
        if($tweet == end($message)) {
            $tweet = $tweet;
        } else {
            $tweet = $tweet . "...";
        }
end($tweets)                      
    - Refers to the last element in the $tweets array
array_shift                         
    - Removes and returns the first element from an array
strlen                              
    - Length of a string
preg_replace('/\s\s+/', ' ', $input) 
    - Replaces excess whitespace, and newlines, with a single space.

答案 1 :(得分:1)

我想说,你可以使用array_reverse函数在最后一个循环之前反转$messages数组:

$messages = array_reverse($messages);