0

リストは次のようになります。

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";
}

ただし、テキストが非常に大きいため、かなり多くのメモリを使用します。テキストを配列に分割せずにこれを行うことができる他の方法はありますか?

4

1 に答える 1

1

ファイルが非常に大きい場合は、。を使用してすべてを一度に配列にロードする代わりに、ファイルを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);

これにより、一度に1行がロードされ、一度に1行が書き込まれます。より少ないメモリを使用する必要があります。

于 2013-03-26T05:33:16.073 に答える