2012-04-25 75 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

相關問題