从csv文件中我需要提取标题和值。之后两者都会在前端访问。
$header = array();
$contacts = array();
if ($request->isMethod('POST')) {
if (($handle = fopen($_FILES['file']['tmp_name'], "r")) !== FALSE) {
$header = fgetcsv($handle, 1000, ",");
while (($values = fgetcsv($handle, 1000, ",")) !== FALSE) {
// array_combine
// Creates an array by using one array for keys
// and another for its values
$contacts[] = array_combine($header, $values);
}
fclose($handle);
}
}
它适用于看起来像这样的csv文件
Name,Firstname,Organisation,
Bar,Foo,SO,
我刚刚导出了我的gmail联系人并尝试使用上面的代码阅读它们但我收到了以下错误
警告:array_combine()[function.array-combine]:两者 参数应具有相同数量的元素
gmail csv看起来像这样
Name,Firstname,Organisation
Bar,Foo,SO
最后一次丢失,
错误的原因是什么?有什么问题以及如何解决?
我在SO
上找到了这个function array_combine2($arr1, $arr2) {
$count = min(count($arr1), count($arr2));
return array_combine(array_slice($arr1, 0, $count),
array_slice($arr2, 0, $count));
}
这样可行,但它会跳过名称字段,而不会合并所有字段。这是因为gmail csv不是真的有效吗?有什么建议吗?
答案 0 :(得分:1)
我通过扩展数组大小或根据标题的大小对其进行切片来管理它。
if (count($header) > count($values)) {
$contacts = array_pad($values, count($header), null);
} else if (count($header) < count($values)) {
$contacts = array_slice($values, 0, count($header));
} else {
$contacts = $values;
}
答案 1 :(得分:1)
虽然这不是您提出的问题的答案,但它可能是问题根源的答案。我最近遇到了这个问题并意识到我犯了一个愚蠢的错误,因为我不理解fgetcsv()
函数的参数:
那里1000
表示您从中获取内容的csv中单行的最大行长度。比这更长,函数返回null
!我不知道为什么示例中给出的版本是如此吝啬,但并不是必需的;将其设置为0
允许fgetcsv()
读取任意长度的行。 (文档警告说这种情况比较慢。对于fgetcsv()
的大多数用例,我很难想象它的速度会慢到足以引起注意。)