2012-01-24 20 views
0

我上傳一個csv並將其擴展到一個數組。如何從php中的數組中找到最大列數和行數

array(6) { 
    [0]=> 
    string(64) "Criteron A-1 bla ,Criteron A-2 bla,Criteron A-3 bla,Criteron A-4 bla,Criteron A-5 bla" 
    [1]=> 
    string(64) "Criteron B-1 bla,Criteron B-2 bla,Criteron B-3 bla,Criteron B-4 bla,Criteron B-5 bla" 
    [2]=> 
    string(51) "Criteron C-1 bla,Criteron C-2 bla,Criteron C-3 bla,Criteron C-4 bla" 
    [3]=> 
    string(38) "Criteron D-1 bla,Criteron D-2 bla,Criteron D-3 bla" 
    [4]=> 
    string(64) "Criteron E-1,Criteron E-2,Criteron E-3,Criteron E-4,Criteron E-5" 
    [5]=> 
    string(51) "Criteron F-1,Criteron F-2,Criteron F-3,Criteron F-4" 
} 

正如您在上面所看到的,原始csv有6行和最多5列。

爲了將這些數據放在表中,我需要知道行數和最大列數。

我可以通過使用count()找到行數。我正在考慮對每個數組使用substr_count()的逗號「,」,並找到最大值,然後將最大值加1,以找出最大列數。 (我還沒有弄清楚如何編碼第二部分,但)

我想知道如果你知道更好的方法。

在此先感謝。

回答

3

可以使用max()array_map()explode()

$maxColumns = max(array_map(function($row){ 
    return count(explode(',', $row)); 
}, $rows)); 
  1. array_map運行數組中的每一行匿名函數獲取列的最大數量,建立其結果的新陣列。

  2. 對於每一行,count(explode())計算逗號分隔的列數。

  3. max()在列計數數組上運行,返回最大值。

1

如果進一步爆炸的行成單獨的項目,是微不足道的數列的最大數目:

// explode further 
$rows = array_map(function ($row) { return explode(',', $row); }, $rows); 

// count 
$cols = max(array_map('count', $rows)); 
$rows = count($rows); 

注:PHP 5.3+的語法。

+0

幾乎與我的回答相同 –

+0

天才思維相似嗎? – deceze

+0

@deceze:CSV文件中的行是不是應該有相同數量的列(即使有些是空的)?如果是這樣,不會在第一行使用'count()'而不是迭代所有行? – FtDRbwLXw6

3

當您將文件讀入內存時,應該使用fgetscsv()函數。它將比基於簡單的explode()substr()的方法更有效地解析數據,考慮許多邊緣情況和CSV功能(如帶引號的字符串)。

你可以把列的運行計數爲您加載:

$maxCols = 0; 
$fileData = array(); 
$fileName = 'myfile.csv'; 

$fp = fopen($fileName, 'r'); 
for ($numRows = 0; ($line = fgetcsv($fp, 8192)) !== FALSE; $numRows++) { 
    $lineCols = count($line); 
    if ($lineCols > $maxCols) $maxCols = $lineCols; 
    $fileData[] = $line; 
} 

echo "Rows: $numRows; Cols: $maxCols; Data: "; 
var_dump($fileData); 

作爲一個方面說明,格式正確的CSV文件確實應該包含在每一行的列相同數量的 - 它應該是是表格的基於文本的表示形式,並且表格應具有確定的一組列和可變數量的行。

0

首先,你應該閱讀的CSV文件與fgetcsv(它應該正確處理所有分隔符,所以你不必在意線,如:1,2,'Text containing don''t and so on'

比你可以使用foreach走線槽的所有項目,或使用max(array_map('count', $rows))

相關問題