使用array_combine存储从csv读取的数据

时间:2013-02-19 20:42:04

标签: php arrays symfony csv

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

2 个答案:

答案 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()的大多数用例,我很难想象它的速度会慢到足以引起注意。)