2013-02-19 66 views
0

从csv文件中,我需要提取标题和值。两者都在后台访问。使用array_combine存储从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); 
    } 
} 

它的工作原理与这个样子

Name,Firstname,Organisation, 
Bar,Foo,SO, 

我只是出口我的Gmail联系人,并尝试使用上面的代码读取它们,但我得到以下错误

警告CSV文件: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

如果CSV以逗号结尾,这可能表示CSV实际上有4列,而不是3。最后一列显然没有名称,但有可能某些行在第4列中包含一个没有匹配'标题'的值。 – thaJeztah 2013-02-19 20:48:04

回答

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

尽管这不是您问的问题的答案,但它可能是问题根源的答案。我最近有这个问题,并意识到我犯了一个愚蠢的错误,因为我不明白fgetcsv()函数的参数:

1000那里表示你正在采取的csv中的单行的最大行长度。比这更长,并且函数返回null!我不知道为什么示例中给出的版本非常吝啬,但它不是必需的;将其设置为0允许fgetcsv()读取任意长度的行。 (文档中警告这个速度较慢,对于大多数使用情况下的fgetcsv(),我几乎无法想象它足够慢了)