-1

2つのファイルがあるとします。

File1.txt

10;30;15;40;12;14;15
23;32;10;50;12;54;60

File2.txt

2;4;5;6;7;8;9
3;6;7;8;9;0;7

これらの2つのファイルの間で微調整したいと思います。元10 - 2........

PHPコード:

$file1 = 'File1.txt';
$file2 = 'File2.txt';
if(file_exists($file1)){
    $files = fopen($file1,'r');         
    while(!feof($files)){                           
        $data = explode(";",fgets($files));
        if($title ==""){
            $title = $data[0];
        }   
        if(!empty($data[3])){                   
            $cate = $data[3];
            $filepmta = fopen($file2,'r');
            while(!feof($filepmta)){                        
                $hourData = explode(";",fgets($filepmta));
                if(!empty($hourData[3])){
                    if($title ==""){
                        $title = $hourData[0];
                    }   
                    if(!empty($btnHour)){
                        echo $percentRed = ((int)$data[2] - (int)$hourData[2]);
                        //it loads page so long time so I don know what's error.
                    }
                }
            }

ページの読み込みに時間がかかるので、修正方法がわかりません。助けてください、ありがとうございます。

4

3 に答える 3

0

両方のファイルを開いて、ファイルの内容をメモリに保存することをお勧めします。IE 2つの単純なループ(ネストされていない)を作成します。これらのループは、両方のファイルをそれぞれ繰り返し処理し、コンテンツを配列に保存します。

次に、最初の2つの後にもう1つのループを作成します。最初の2つの配列サイズに基づいて、3番目のループを繰り返します。(両方とも同じサイズであると想定できると思いますが、ループ1とループ2が同じサイズ/長さの配列を生成することを確認するためのチェックを追加することをお勧めします。

3番目のループ内で、同じインデックスを持つ以前に生成された2つの配列の両方を反復処理します。

擬似コード//擬似コードを実行すると言っても、すべてを実行することになりました。:-/

$file_values1 = $file_values2 = $answers = array();

while(!feof($file1)) $file_values1[] = explode(';', fgets($file)); // loop 1
while(!feof($file2)) $file_values2[] = explode(';', fgets($file)); // loop 2

foreach($file_values1 as $key1 => $sub_array) { // loop 3
  foreach($sub_array as $key2 => $value) // loop 4; hehe, oh wellz
  {
      $answers[] = $file_values1[$key1][$key2] = $file_values2[$key1][$key2]
  }
}

基本的に、ネストされたループ4、まあ。より速い答えがあります。3番目のループはO(N ^ 2)で改善できます。最適化するためにそれを残しておきます。フリーランチはありません。:-)

于 2013-01-14T03:15:16.713 に答える
0

fgets()はファイルポインタを最後の行の後に移動しないため、最後の行に留まり、feof()は引き続き戻りfalse、無限ループに陥ります。

あなたが望むことをする一般的な方法は次のとおりです。

while (($line = fgets($handle)) !== false) {
    echo $line;
}

fgets()ドキュメントのコード例を見てください。これは非常に網羅的です。

于 2013-01-14T03:22:04.773 に答える
0

あなたはこの方法を必要以上に複雑にしています。

  1. ファイルを開き、両方をで読み込んでくださいfile()。これにより、各ファイルに一連の行が表示されます。
  2. 同時に両方のラインアレイを反復処理しますMultipleIterator
  3. str_getcsv()各行の内容をとarray_map()トリックを使用して配列に変換します。
  4. 各行の値を別ので繰り返しますMultipleIterator
  5. 減算を計算して印刷します。

必要なのはそれだけです!上記のアルゴリズムを以下に実装しました。

$file1 = 'File1.txt';
$file2 = 'File2.txt';

$file1 = file( $file1);
$file2 = file( $file2);

$iter = new MultipleIterator;
$iter->attachIterator( new ArrayIterator( $file1));
$iter->attachIterator( new ArrayIterator( $file2));

foreach( $iter as $element) {
    list( $line1, $line2) = array_map( 'str_getcsv', $element, array( ';', ';'));

    $val_iter = new MultipleIterator;
    $val_iter->attachIterator( new ArrayIterator( $line1));
    $val_iter->attachIterator( new ArrayIterator( $line2));

    foreach( $val_iter as $value) {
        list( $el1, $el2) = $value;
        echo ($el1 - $el2); echo ";";
    }
    echo "\n";
}

ファイルを配列として静的に定義するこのデモから、次のことがわかります。

8;26;10;34;5;6;6;
20;26;3;42;3;54;53;
于 2013-01-14T03:41:23.137 に答える