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