2013-10-01 171 views
0

我是PHP新手,嘗試使用fscanf讀取CSV文件以確定最小值和最大值。我的previous問題給出了我實際嘗試做什麼的概述。我正在嘗試使用fscanf查找CSV列的最大值和最小值,如下所示。PHP - 動態參數和動態變量

$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; 

對於我的場景,我可以動態獲取CSV文件。我想根據列數使用上面的代碼。舉例來說,如果我有4列,我需要使用以前的代碼,

while (fscanf($file, '%d%d%d%d', $a, $b, $c, $d)) { 

,並確定最大值和最小值的所有CSV文件的4列。如果它只有3列,我需要使用代碼:

while (fscanf($file, '%d%d%d', $a, $b, $c)) { 

並確定CSV文件中所有3列的最大值和最小值。有沒有辦法在PHP中做到這一點?有人請引導我在正確的方向。

+0

作爲一個快速提示,你可以看看PHP的fgetcsv功能 - http://php.net/manual/en/function.fgetcsv.php - 讀取每行到一個數組。這可能會有幫助,因爲您可以使用數組運算功能,如max - http://php.net/manual/en/function.max.php - 和min。 – mszaro

回答

0

如果你只傳遞兩個參數,以fscanf,它將返回解析值作爲一個數組,所以你應該能夠做這樣的事情:

$colCount = getColumnCount ($file); //left as an exercise 
$pattern = str_repeat ('%d', $colCount); 
while ($values = fscanf ($file, $pattern)) { 
    ... 
} 

我已經制定了$pattern像你描述,但您可能需要將其與CSV文件的格式相匹配。例如,如果您的文件使用逗號分隔符,則您的模式可能需要看起來像str_repeat("%d,", $colCount)

+0

我已經按照您的建議進行了更改。但是,我無法在程序中使用該變量。例如,如果我們只有2列,則while循環將是while(fscanf($ file,%d%d,$ a,$ b))。要自動生成%d和變量名稱,只需要使用兩個變量作爲$ pattern和$ pattern1。但是,我無法在程序中使用變量名稱。如果我用$模式1產生的變量名,我不能夠看到任何輸出。 –

+0

如果你按照我的建議,while語句應該不會像'而(的fscanf($文件,%d%d $ A,$ B))'。它應該看起來像'而($值=的fscanf($文件, '%d%d'))',然後你會發現在'$匹配的列值值[0]'和'$值[1]'內循環。 – grossvogel