The list looks like:
Lorem ipsum dolor sit amet,
consectetur adipisicing elit,
sed do eiusmod tempor
...
I want to indent all words like this:
Lorem ipsum dolor sit amet,
consectetur adipisicing elit,
sed do eiusmod tempor
(or at least the first column)
I've managed to do this using arrays and str_pad
:
$lines = explode("
", $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 .= "
";
}
but because the text is very large it uses quite a lot of memory. Is there any other way I can do this, without splitting the text in arrays?
If the file is extremely large, you could read the file line by line instead of loading it all into an array at once with 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);
This loads one line at a time and writes one line at a time. Should use less memory.