2016-04-17 133 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次出現爲止。

相關問題