列表如下:
Lorem ipsum dolor sit amet,
consectetur adipisicing elit,
sed do eiusmod tempor
...
我想缩进所有这样的词:
Lorem ipsum dolor sit amet,
consectetur adipisicing elit,
sed do eiusmod tempor
(或至少第一栏)
我已成功使用数组和str_pad
:
$lines = explode("\n", $text);
$counts = array();
foreach($lines as $line){
$words = explode(' ', $line);
foreach($words as $index => $word){
if(!isset($counts[$index]) || $counts[$index] < strlen($word))
$counts[$index] = strlen($word);
}
}
$text = '';
foreach($lines as $line){
$words = explode(' ', $line);
foreach($words as $index => $word)
$text .= str_pad($word, $counts[$index], ' ' , STR_PAD_RIGHT) . ' ';
$text .= "\n";
}
但是由于文本非常大,它会占用大量内存。有没有其他方法可以做到这一点,而不在数组中拆分文本?
答案 0 :(得分:1)
如果文件非常大,您可以逐行读取文件,而不是将其全部加载到文件中
与file()
一起使用数组。
$fh = fopen("alice.txt", "r");
$fh = fopen("yourfile.txt", "r");
while( !feof($fh) ){
$line = fgets($fh);
$Newerline = str_replace("-", " ", $line);
$textArray = str_word_count($Newerline,1);
//now go through the line word by word
foreach ($textArray as $index => $word){
trim($word);
$wordLength = mb_strlen($word);
//is this word the longest for this column?
if($wordLength > $longWords[$index]['longestWordlen'] ){
$longWords[$index]['longestWordlen'] = $wordLength;
$longWords[$index]['longestWord'] = $word;
}
}
//echo $line;
}
//rewind the file pointer to the beginning
rewind($fh);
ksort($longWords);//associative array will be out of order since longest word shows up differently
//now create a new file to hold the new version
$fileh = fopen( "newFile.txt", "c");
while( !feof($fh) ){
$line = fgets($fh);
$Newerline = str_replace("-", " ", $line);
$textArray = str_word_count($Newerline,1);
$newLine = "";
//now go through the line word by word
foreach ($textArray as $index => $word){
//set the length of this words column
$pad_length = $longWords[$index]['longestWordlen'];
$newLine .= str_pad($word, $pad_length + 1, " ", STR_PAD_RIGHT);
}
$newLine .= PHP_EOL;
//save the newLine to file
fwrite($fileh, $newLine);
//echo $newLine;
}
fclose($fileh);
fclose($fh);
一次加载一行并一次写入一行。应该少用内存。