我正在做一个发送SMS消息的小项目。我已经编写了消息类,并准备以正确的格式发回。
然而,我遇到了一个技术设计问题。我确信它很容易解决,但我以前从未遇到过这个问题,所以我迷失在黑暗中。
当我返回一条超过160个字符的消息时,它显然需要分解成更小的消息并单独发送。我的第一个想法显然是得到字符串长度,然后将其除以160个字符,并四舍五入到最大整数(因为你不能发送2.5条消息,只有3条(,然后每条短信都需要在消息中有1/3、2/3、3/3等,并向用户显示读取它们的顺序。(相信我,他们会需要的(
我的想法显然是使用某种循环为每个160个字符的消息创建一个"new ServiceMessage(("。但我不确定到底该怎么做,也不确定如何显示消息的计数(1/2、2/3等(。
我相信这相当简单,但这是我的第一次尝试,所以我们非常感谢任何帮助!非常感谢。
$messages = str_split($message , 160);
foreach($messages as $message){
// send $message
}
一个更复杂的版本,消息本身的数量可以是这样的,代码是未经测试的:
if(strlen($message) > 160){
/// lets use 152 characters and keep room for message number like (1/10),
/// we can have upto 99 parts of the message (99/99)
$messages = str_split($message , 152);
$how_many = count($messages);
foreach($messages as $index => $message){
$msg_number = ($index + 1);
$message = "(".$msg_number."/".$how_many.") ".$message;
// send $message
}
}
else{
// send $message
}
上面的内容可能会在每条消息中浪费2个字符,但它使计算相当简单。
我还没有测试过,但类似于:
$len = strlen($message);
$parts = ceil($len / 160);
$last = 0;
for ($i = 1; $i <= $parts; $i++) {
echo "Sending part " . $i . " of " . $parts;
// Extract the next 160 characters
$message_part = substr($message, $last, 160);
$last += 160;
// Send message
new ServiceMessage($message_part);
}
$messageSize = strlen( $message );
$segmentSize = 160
for ( $segment = 0; $segment * $segmentSize < $messageSize; $segment++ ) {
$header = ($segment + 1).'/'.($messageSize / 160 + 1).' ';
$segments[$segment] = substring( $message,
$segment * $segmentSize,
$segmentSize - strlen( $header ) );
}
//Your messages will be in the array $messages at this point
即兴表演——但这应该很接近。
如果不知道ServiceMessage类是如何工作的,我就无法真正为您提供完美的代码,但这应该非常接近您的需求。将其放入函数中将返回ServiceMessage对象或ServiceMessages对象数组。从那里开始,如果ServiceMessage类本质上没有这样做,那么就可以简单地使用您想要的函数来发送消息。
function getServiceMessage($message, $maxLen = 160)
{
if(strlen($message) < $maxLen)
return new ServiceMessage($message);
$messages = explode(PHP_EOL, wordwrap($message, $maxLen - 5, PHP_EOL, TRUE));
for ($i = 0, $j = 1, $k = count($messages); $i <= $k; ++$i, ++$j)
$messages[$i] = new ServiceMessage("($j/$k){$messages[$i]]}");
return $messages;
}
需要注意的是,这只适用于长度小于1600个字符的消息,如果您需要发送的消息大于1600个字符,则需要将$maxLen - 5
更改为$maxLen - 7
,以便正确格式化数字部分。如果您希望发送大于16000的消息,则需要将其更改为$maxLen - 9
,依此类推。