0

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

(消息应按此顺序发送,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]);
}
  }
}
4

2 回答 2

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;
}

现场演示了这一点

这是发送多部分推文的函数,将“...”附加到数组中除最后一条推文之外的所有推文:

// 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.
于 2013-09-06T10:56:53.310 回答
1

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

$messages = array_reverse($messages);
于 2013-09-06T10:56:27.983 回答