我上传了一个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 回答
当您将文件读入内存时,您应该使用fgetscsv()函数 . 它将比基于简单的
explode()
或substr()
的方法更有效地解析数据,考虑到许多边缘情况和CSV特征,如带引号的字符串 .您可以在加载时保持列的运行计数:
作为旁注,正确格式化的CSV文件应该在每一行中确实包含相同数量的列 - 它应该是基于文本的表的表示,并且表应该具有一组明确的列和可变数量的行 .
如果将行进一步分解为单个条目,则计算最大列数非常简单:
注意:PHP 5.3语法 .
首先,您应该使用fgetcsv读取csv文件(它应该正确处理所有分隔符,因此您不必关心诸如以下行:
1,2,'Text containing don''t and so on'
.你可以使用
foreach
来通过所有项目,或使用max(array_map('count', $rows))
.您可以使用
max()
,array_map()
和explode()
获取最大列数array_map
为数组中的每一行运行匿名函数,创建一个包含结果的新数组 .对于每一行,
count(explode())
计算其中逗号分隔的列数 .max()
在列计数数组上运行,返回最大的列数 .