我正在使用以下代码将长消息拆分为多条短消息。 反转发送顺序的最简单方法是什么,所以最后一条消息先发送?
(邮件应按此顺序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]);
}
}
}
答案 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;
}
这是发送多部分推文的功能,除了数组中的最终推文外,还附加'...':
// 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);