# delimiter bei fputcsv



## Kalito (1. Mai 2013)

Hallo,

ich habe ein Array, welches ich in eine CSV packen möchte. mit 

```
fputcsv($file, $array);
```

klappt das wunderbar. Nun möchte ich aber, dass die einzelnen Daten in " eingebettet werden und durch ; voneinander getrennt sind. Ich habe folgendes probiert (inkl. Fehlermeldung):

```
//Fehlermeldung: fputcsv() expects parameter 2 to be array, null given
    fputcsv($file, split(';',$array),'"');
  
    //Fehlermeldung: fputcsv() expects parameter 3 to be array, null given
    fputcsv($file, split(';',' " ',$array),'"');
```

Wo ist da mein Denkfehler.

Gruß, Kalito


----------



## Yaslaw (1. Mai 2013)

Wie sieht denn $array aus?
Wenn $array das ist was der Name sagt, dann brauchst du doch kein split()

```
int fputcsv ( resource $handle , array $fields [, string $delimiter = ',' [, string $enclosure = '"' ]] )
```

ergibt doch ganz einfach

```
fputcsv($file, $array, ';', '"');
```

Also, wozu der split() ?


----------



## Kalito (5. Mai 2013)

Anscheinend habe ich das Lesen verlernt :/. Danke hierfür.
Habe noch eine weitere Frage. Ich möchte die CSV anschließend zum Download anbieten. Jedoch wird in dem gedownloadeten CSV die HTML-Struktur angezeigt, aber nicht die CS-Daten. Schaue ich mir die CSV auf den Server an, so ist diese korrekt.
Aktuell sieht mein Code so aus:

trainings.php

```
public function export_traininglist($id){
        $training = $this->Training->find('first', array('conditions'=>array('Training.id'=>$id)));
        $userarray = array(0=>array());
        foreach($training['User'] as $user){            
            $userarray[0][] = array($user['firstname'],$user['lastname']);
        }

        $csvarray = array(
            'filename' => $training['Training']['name'],
            'key' => array("Vorname", "Nachname"),
            'value' => $userarray
        );
        //erstellt die CSV und bietet Sie zum Download an
        header('Content-type: text/csv');
        header('Content-Disposition: attachment; filename="'.$csvarray['filename'].'.csv"');
        $this->Csv->createCsv($csvarray);
    }
```
und die Funktion zur CSV-Erstellung:

```
public function createCsv($data){
        $csv = fopen($data['filename'].".csv", 'a');
        
        //Kopfzeile
        fputcsv($csv, $data['key'],';','"');
        
        //Daten
        foreach($data['value'] as $valueArray){
            foreach($valueArray as $value){
                fputcsv($csv, $value,';','"');
            }
        }
        fclose($csv);
    }
```


----------



## alxy (5. Mai 2013)

Du sendest nach den headern anscheinend nurnoch HTML code, und nicht die CSV-Datei.

Vorschlag:

```
public function doDownload($data, $type, $name) { 
	header('Content-Type: ' . $type . '');
	header('Content-Length: '.strlen($data));
    header('Content-Disposition: attachment; filename=' . $name);
	echo $data;
	exit();
}
```


```
public function export_traininglist($id){
        $training = $this->Training->find('first', array('conditions'=>array('Training.id'=>$id)));
        $userarray = array(0=>array());
        foreach($training['User'] as $user){            
            $userarray[0][] = array($user['firstname'],$user['lastname']);
        }

        $csvarray = array(
            'filename' => $training['Training']['name'],
            'key' => array("Vorname", "Nachname"),
            'value' => $userarray
        );
        //erstellt die CSV und bietet Sie zum Download an
        $this->Csv->createCsv($csvarray);
        $data = file_get_contents($csvarray['filename']);
		$this->doDownload($data, 'text/csv', 'csvdata.csv');
    }
```

ungetestet.


----------

