我正在开发一个发送短信的小项目。我已经编写了消息类,并准备以正确的格式发回。
但是,我遇到了技术设计问题。我确信它很容易解决,但我之前没有遇到过这个问题所以我在黑暗中迷失了。
当我返回超过160个字符的消息时,显然需要将其分解为较小的消息并单独发送。我的第一个想法显然是获取字符串长度,然后除以160个字符,并向上舍入到最大整数(因为你不能发送2.5个消息,只有3个)然后每个短信需要有1/3,2 /消息中的3,3 / 3等也向用户显示了读取它们的顺序。(相信我,他们需要它)
我的想法显然是使用某种循环为每个160 char消息创建一个'new ServiceMessage()'。但我不确定该怎么做,也不确定如何显示消息的数量(1 / 2,2 / 3等)。
相当简单,我确信,但这是我的第一枪 - 所以任何帮助都非常感谢!谢谢!
答案 0 :(得分:6)
$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个字符,但它会使计算变得相当简单。
答案 1 :(得分:0)
我没有测试过这个,但是有点像:
$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);
}
答案 2 :(得分:0)
$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
关闭袖口 - 但这应该很接近。
答案 3 :(得分:0)
在不知道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个字符的消息,如果您需要发送大于此的消息,则需要将$maxLen - 5
更改为$maxLen - 7
以便允许它正确格式化数字部分。如果您希望发送大于16000的消息,则需要将其更改为$maxLen - 9
,依此类推,等等。