-1

假设我有 2 个文件:

文件1.txt

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

文件2.txt

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

我想在这两个文件之间进行减法。前任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 个简单循环(非嵌套),分别遍历两个文件并将内容保存到数组中。

然后在前两个之后再做一个循环。根据前两个的数组大小迭代第三个循环。(我假设您可以假设它们的大小相同,但最好添加检查以确保循环 1 和循环 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,嗯。有更快的答案。第三个循环可以改进,它是 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";
}

您可以从这个 demo中看到,它将文件静态定义为数组,这会产生:

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