我上传了一个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中添加一个以找出最大列数。 (虽然我还没弄明白如何编写第二部分代码)
我想知道你是否知道更好的方法。
提前致谢。
答案 0 :(得分:3)
您可以使用max()
,array_map()
和explode()
$maxColumns = max(array_map(function($row){
return count(explode(',', $row));
}, $rows));
array_map
为数组中的每一行运行匿名函数,创建一个包含结果的新数组。
对于每一行,count(explode())
计算其中逗号分隔的列数。
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))
。