Détail de la fonction

La fonction fputscv prends 4 arguments, dont deux sont optionnels:

int fputcsv ( resource $handle , array $fields [, string $delimiter [, string $enclosure ]] )

  • $handle est le pointeur de fichier,
  • $fields est le tableau des champs à insérer,
  • $delimiter est le caractère de séparation des champs (',' par défaut)
  • $enclosure est le caractère d'encadrement ('"' par défaut). Il n'est utilisé que si la valeur contient un caractère particulier qui est soit le délimiteur, soit le caractère d'encadrement soit un caractère non-imprimable (tabulation, retour à la ligne, nouvelle ligne).

Le retour est soit la longueur de la chaîne écrite, soit false en cas d'erreur.

Code source

<?php
if (!function_exists('fputcsv')) {
	function fputcsv( &$handle, $fields, $delimiter=',', $enclosure='"') {
		$sts = false;
		$escape_char = '\\';
		$arr = array();
		// Gestion des erreurs
		if (!is_resource($handle)) {
			// $handle n'est pas une ressource valable
			trigger_error('fputcsv() expects parameter 1 to be resource, ' . gettype($handle) . ' given', E_USER_WARNING);
			return $sts;
		}
		if ($delimiter!=NULL) {
			if( strlen($delimiter) < 1 ) {
				// Le délimiteur n'est pas un caractère valide
				trigger_error('delimiter must be a character', E_USER_WARNING);
				return $sts;
			}elseif( strlen($delimiter) > 1 ) {
				// Le délimiteur est une chaîne
				trigger_error('delimiter must be a single character', E_USER_NOTICE);
			}
			$delimiter = $delimiter[0];
		}
		if($enclosure!=NULL) {
			if( strlen($enclosure) < 1 ) {
				// L'encadrement n'est pas un caractère valide
				trigger_error('enclosure must be a character', E_USER_WARNING);
				return $sts;
			}elseif( strlen($enclosure) > 1 ) {
				// L'encadrement est une chaîne
				trigger_error('enclosure must be a single character', E_USER_NOTICE);
			}
			$enclosure = $enclosure[0];
		}
		// Partie active
		foreach($fields as $field) {
			if (preg_match('!('.$delimiter.'|'.$enclosure.'|\n|\r|\t| )!', $field)) {
				// Le champ contient un caractère à protéger
				$strtmp = $enclosure;
				$escaped = false;
				for( $i=0; $i<strlen($field); $i++) {
					if($field[$i] == $escape_char) $escaped = true;
					elseif(!$escaped && $value[$i] == $enclosure) $strtmp .= $enclosure;
					else $escaped = false;
					$strtmp .= $field[$i];
				}
				$strtmp .= $enclosure;
				$arr[] = $strtmp;
			} else {
				$arr[] = $field;
			}
		}
		// Création de la chaîne et copie dans le fichier
		$str = implode($delimiter, $arr);
		if (fwrite($handle, $str.chr(13).chr(10))) $sts = strlen($str);
		return $sts;
	}
}
?>

Utilisation de la fonction

Il suffit ensuite de passer à la fonction un tableau contenant les divers éléments constituant la ligne

<?php
$list = array (
    'a;aa,bb/b,ccc,dddd',
    '123,456,789',
    '"aaa","bbb"'
);
 
$fp = fopen('test.csv', 'w');
foreach ($list as $line) {
    fputcsv($fp, split(',', $line), ";", "'");
}
 
fclose($fp);
?>

Cet exemple donnera le résultat suivant:

'a;aa';bb/b;ccc;dddd
123;456;789
"aaa";"bbb"