如何在php中找到数组中的最大列数和行数

时间:2012-01-24 13:37:45

标签: php

我上传了一个csv并将其加载到一个数组中。

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()并查找max然后在该max中添加一个以找出最大列数。 (虽然我还没弄明白如何编写第二部分代码)

我想知道你是否知道更好的方法。

提前致谢。

4 个答案:

答案 0 :(得分: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 :(得分: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文件应该在每一行中确实包含相同数量的列 - 它应该是基于文本的表格表示,并且表格应该有一组明确的列和变量行数。

答案 2 :(得分: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+语法。

答案 3 :(得分:0)

首先,您应该使用fgetcsv读取csv文件(它应该正确处理所有分隔符,因此您不必关心诸如1,2,'Text containing don''t and so on'之类的行。

您可以使用foreach来浏览所有项目,或使用max(array_map('count', $rows))