首页 文章

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

提问于
浏览
0

我上传了一个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 回答

  • 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

    如果将行进一步分解为单个条目,则计算最大列数非常简单:

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

    注意:PHP 5.3语法 .

  • 1

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

    你可以使用 foreach 来通过所有项目,或使用 max(array_map('count', $rows)) .

  • 3

    您可以使用 max()array_map()explode() 获取最大列数

    $maxColumns = max(array_map(function($row){
        return count(explode(',', $row));
    }, $rows));
    
    • array_map 为数组中的每一行运行匿名函数,创建一个包含结果的新数组 .

    • 对于每一行, count(explode()) 计算其中逗号分隔的列数 .

    • max() 在列计数数组上运行,返回最大的列数 .

相关问题