在循环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.