0

$chapter 是一个字符串,它存储一本书的一章,包含 10,000 - 15,000 个字符。我想将字符串分成至少 1000 个字符的段,但在下一个空格之后正式中断,这样我就不会分解一个单词。提供的代码将成功运行大约 9 次,然后会遇到运行时问题。

“致命错误:第 16 行的 D:\htdocs\test.php 中超过了 30 秒的最大执行时间”

<?php
$chapter = ("10000 characters")
$len = strlen($chapter);
$i=0; 
do{$key="a";
  for($k=1000;($key != " ") && ($i <= $len); $k = $k+1) {
    $j=$i+$k; echo $j;
    $key = substr($chapter,$j,1);
  }
  $segment =  substr ($chapter,$i,$k);
  $i=$j;
echo ($segment);
} while($i <= $len);
?>
4

5 回答 5

1

我认为您编写它的方法开销太大,虽然增加 max_execution_time 会有所帮助,但并不是每个人都能够修改他们的服务器设置。这个简单的事情将 15000 字节的 lorum ipsum 文本(2k 字)分成 1000 个字符段。我认为它会做得更好,因为执行时间相当快。

//Define variables, Set $x as int(1 = true) to start
$chapter = ("15000 bytes of Lorum Ipsum Here");
$sections = array();
$x = 1;

//Start Splitting
while( $x ) {

    //Get current length of $chapter
    $len = strlen($chapter);

    //If $chapter is longer than 1000 characters
    if( $len > 1000 ) {

        //Get Position of last space character before 1000
        $x = strrpos( substr( $chapter, 0, 1000), " ");

        //If $x is not FALSE - Found last space
        if( $x ) {

            //Add to $sections array, assign remainder to $chapter again
            $sections[] = substr( $chapter, 0, $x );
            $chapter = substr( $chapter, $x );

        //If $x is FALSE - No space in string
        } else {

            //Add last segment to $sections for debugging
            //Last segment will not have a space. Break loop.
            $sections[] = $chapter;
            break;
        }

    //If remaining $chapter is not longer than 1000, simply add to array and break.
    } else {
        $sections[] = $chapter;
        break;
    }
}
print_r($sections);

编辑:

  • 在几分之一秒内使用 5k 个字(33K 字节)进行测试。将文本分为 33 段。(哎呀,我之前把它设置为 10K 个字符段。)

  • 在代码中添加了详细的注释,以解释一切的作用。

于 2013-08-28T17:46:54.313 回答
0

您总是从一开始就阅读 $ 章节。你应该从 $chapter 中删除已经读过的字符,这样你读到的字符永远不会超过 10000 个。如果你这样做,你还必须调整周期。

于 2013-08-28T17:16:13.827 回答
0

尝试

set_time_limit(240);

在代码的开头。(这是 ThrowSomeHardwareAtIt 方法)

于 2013-08-28T17:17:58.947 回答
0

它可以在一行中完成,从而大大加快了您的代码速度。

echo $segment = substr($chapter, 0, strpos($chapter, " ", 1000));

它将使用章节的子字符串直到 1000 + 一些字符直到第一个空格。

于 2013-08-28T17:21:17.127 回答
0

这是一个简单的功能

$chapter = "Your full chapter";
breakChapter($chapter,1000);

function breakChapter($chapter,$size){
    do{
       if(strlen($chapter)<$size){
           $segment=$chapter;
           $chapter='';
       }else{
           $pos=strpos($chapter,' ', $size);
           if ($pos==false){
               $segment=$chapter;
               $chapter='';
           }else{
               $segment=substr($chapter,0,$pos);
               $chapter=substr($chapter,$pos+1);
           }
       }
       echo $segment. "\n";
    }while ($chapter!='');
}

检查每个字符不是一个好的选择,而且是资源/时间密集型的

PS:我没有测试过这个(只是在这里输入),这可能不是最好的方法。但逻辑有效!

于 2013-08-28T17:25:24.880 回答