Php 使用数组_组合存储从csv读取的数据

Php 使用数组_组合存储从csv读取的数据,php,arrays,symfony,csv,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 (($

从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,
Name,Firstname,Organisation
Bar,Foo,SO
我刚刚导出了我的gmail联系人,并试图用上面的代码读取他们,但我得到了以下错误

警告:array_combine()[function.array combine]:两者都有 参数应具有相同数量的元素

gmail csv看起来像这样

Name,Firstname,Organisation,
Bar,Foo,SO,
Name,Firstname,Organisation
Bar,Foo,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不是真正有效的吗?有什么建议吗?

我通过扩展数组大小或根据标头的大小对其进行切片来实现这一点

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;
}
if(计数($header)>计数($value)){
$contacts=array_pad($value,count($header),null);
}else if(计数($header)
虽然这不是您所问问题的答案,但它可能是问题根源的答案。我最近遇到了这个问题,意识到我犯了一个愚蠢的错误,因为我不理解
fgetcsv()
函数的参数:


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

如果CSV以逗号结尾,这可能表明CSV实际上有4列,而不是3列。最后一列显然没有名称,但有些行可能在第四列中包含一个值,而没有匹配的“header”。