0

我需要从 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 不是真的有效吗?有什么建议么?

4

2 回答 2

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;
}
于 2013-02-20T09:03:59.313 回答
1

虽然这不是您提出的问题的答案,但它可能是问题根源的答案。我最近遇到了这个问题,并意识到我犯了一个愚蠢的错误,因为我不了解fgetcsv()函数的参数:

那里1000表示您从中获取内容的 csv 中单行的最大行长度。比这更长,函数返回null!我不知道为什么示例中给出的版本如此吝啬,但这不是必需的;将其设置为0允许fgetcsv()读取任意长度的行。(文档警告说这比较慢。对于大多数用例,fgetcsv()我几乎无法想象它慢到足以引起注意。)

于 2014-09-04T16:44:38.870 回答