2016-04-17 99 views
0

我想在PHP中将一个巨大的字符串解析为较小的字符串。我有一个以\n结尾的字符串。我想在第二个\n之后得到这个句子,直到第五个\n如何获得字符串到第n次出现的字符在PHP中?

我设法做到了这一点,但由于我处理的字符串很大,因此需要大量的时间。这是我使用的方法:

$arrayBuffer = explode("\n", $buffer); 
for($i = 0; $i < $NumOfRequests; $i++) { 
    $tmpBuffer = ""; 
    for($j = $i * $NumOfAllowedRows; $j < ($i + 1) * $NumOfAllowedRows; $j++) { 
     // stop the loop if it reached the last cell of arrayBuffer, to avoid Index Out Of Bound Exception 
     if($j === $arrayBuffer[count($arrayBuffer)]){ 
      break; 
     } 
     $tmpBuffer = $tmpBuffer . $arrayBuffer[$j] . "\n";     
    } 
     // do something with the tmpBuffer     
} 

目的是从第一个$缓冲区本身取一个子串而不创建另一个数组。

+0

您应该使用生成器来循环blob,只产生你想要的行。与使用for循环相比,它们有很大的优势。 – Xorifelse

+0

这似乎是一个很好的答案,但不幸的是我使用的是PHP 5.3。我不能升级它:(。 – MuhammadNe

+0

没有使用生成器,你可以逐行读取你的字符串(或文件)使用流。 –

回答

0

我发现使用爆炸和内爆一个很好的解决方案,它是速度不够快,下面是一个例子代码:

$buffer = "aaa\nbbb\nccc\nddd\neee\nfff\nggg\nhhh\niii\n"; // enter file path here 
for($i = 0; $i < 5 ; $i++){ 

$arr = explode("\n", $buffer); 
//strlen(implode("\n", array_slice($arr, 0, 6))); 
$position = (strlen(implode("\n", array_slice($arr, 0, 3)))); 

$tmpBuffer = substr($buffer,0,$position); 
$buffer = substr($buffer, $position); 

error_log("tmpbuffer : ".$tmpBuffer).PHP_EOL; 
error_log("buffer : " . $buffer).PHP_EOL; 

爆炸将分字符串转换成一块块,然后我得到了人物的第n次出现在字符串strlen将获得子字符串的长度,直到第n次出现为止。

相关问题