2012-04-25 85 views
1

最大/最小/平均价值我在格式的文件快捷的方式找到文件中查找

1 52 
2 456 
3 4516 
5 4545 
6  41 

会是什么文件中读取并获得最大/最小/平均价值的最快方法在PHP的第二列?

+0

PHP已经拥有的东西按行来解析文件....这是一个调用的函数...'文件()' 也就是说,@ mellamokb的解决方案非常好,它解决了解析以及在PHP代码之外拆分文件,因此它应该比纯粹的PHP代码更快。 – Christian 2012-04-25 22:48:22

+0

文件大小是多少? – 2012-04-26 04:52:57

回答

1

类似于以下内容,其中<filename>是文件的路径。

$file = fopen('<filename>', 'r'); 

$a = 0; 
$b = 0; 
$first = true; 
while (fscanf($file, '%d%d', $a, $b)) { 
    if ($first) 
    { 
     $min = $b; 
     $max = $b; 
     $total = $b; 
     $count = 1; 
     $first = false; 
    } 
    else 
    { 
     $total += $b; 
     if ($b < $min) $min = $b; 
     if ($b > $max) $max = $b; 
     $count++; 
    } 
} 
$avg = $total/$count; 

演示:http://ideone.com/rWbqm

+0

这是给我“呼叫时间通过引用已被弃用”是否可以,如果我删除&? – user391986 2012-04-25 22:37:00

+0

如果我这样做给我“未定义的变量a” – user391986 2012-04-25 22:38:46

+0

@ user391986:啊,是的,我相信你可以。您可能必须将'$ a'和'$ b'预设为默认值。查看更新。还添加了示例如何用['fopen'](http://php.net/fopen)打开文件 – mellamokb 2012-04-25 22:38:47

1

从制造代码@mellamokb一些性能改进:

$file = fopen('<filename>', 'r'); 

$a = $b = 0; 
if (fscanf($file, '%d%d', $a, $b)) 
{ 
    $min = $max = $total = $b; 
    $count = 1; 
    while (fscanf($file, '%d%d', $a, $b)) 
    { 
     $total += $b; 
     if ($b < $min) $min = $b; 
     else if ($b > $max) $max = $b; 
     ++$count; 
    } 
    $avg = $total/$count; 
} 
else 
{ 
    // Do something here as there is nothing in the file 
} 
+0

性能改进?功能上看起来相同,尽管更简洁一点。除非'if($ first)'的运行速度比我想象的要慢得多;-) – mellamokb 2012-04-26 13:40:55

+0

在第一行之后的每一行保存'if $ first'。如果它找到了新的最小值,也跳过检查。这取决于我想的文件的大小。 – 2012-04-26 13:43:04

相关问题