O PHP tem algumas funções excelentes para analisar e gerar arquivos com valores separados por vírgula (CSV), mas é insuficiente quando se trata de retornar esses dados como uma string. Claro, você poderia mapear a matriz com implode
, mas qual seria o resultado disso se você estivesse lidando com informações que contêm vírgulas nos próprios valores? Felizmente, você pode combinar as funções integradas do PHP com algum encapsulamento de fluxo bem colocado para preencher as lacunas.
Em primeiro lugar, as funções a seguir são suportadas pelo PHP pronto para uso:
- fgetcsv – Semelhante a fgets (), exceto que fgetcsv () analisa a linha que lê em busca de campos no formato CSV e retorna um array contendo os campos lidos.
- fputcsv – Formata uma linha (passada como uma matriz de campos) como CSV e a grava (terminada por uma nova linha) no identificador de arquivo especificado.
- str_getcsv – (PHP 5.3.0 +) Analisa uma entrada de string para campos no formato CSV e retorna um array contendo os campos lidos.
O snippet de código abaixo implementa um novo str_putcsv , que espera uma matriz de matrizes associativas e retorna uma string formatada em CSV.
/**
* Convert a multi-dimensional, associative array to CSV data
* @param array $data the array of data
* @return string CSV text
*/
function str_putcsv($data) {
# Generate CSV data from array
$fh = fopen('php://temp', 'rw'); # don't create a file, attempt
# to use memory instead
# write out the headers
fputcsv($fh, array_keys(current($data)));
# write out the data
foreach ( $data as $row ) {
fputcsv($fh, $row);
}
rewind($fh);
$csv = stream_get_contents($fh);
fclose($fh);
return $csv;
}
Conclusão
A função acima evoluiu de anos escrevendo scripts de exportação de dados para distribuição por e-mail. Existem outras funções por aí que fazem a conversão de array para CSV, mas algumas introduzem sobrecarga adicional para corrigir as deficiências do formato CSV. O que eu gosto é que o código acima é claro e conciso. Terceirizando o trabalho pesado para a função interna do PHP fputcsv
, não é necessário envolver coisas como str_replace
escapar dos valores CSV com vírgulas ou aspas.