Banner

Ultima revisión 22/12/2012

Convertir de Array a CSV en PHP (array2CSV)

array2csv es una función que permite convertir un array asociativo en un archivo CSV de forma muy sencilla. Como veréis, sólo hay que enviarle un array bien formado.

Si se quiere presentar por pantalla, se deben eliminar las cabeceras del final del código. Si, por el contrario se desea enviar a Excel habrá que dejar las cabeceras (los header) del código como están y saltará solo.

Por hacer una pequeña introducción, Los ficheros CSV (Comma Separated Values) son un tipo de documento en formato abierto sencillo para representar datos en forma de tabla, en las que las columnas se separan por comas (o punto y coma en donde la coma es el separador decimal como España) y las filas por saltos de línea. Los campos que contengan una coma, un salto de línea o una comilla doble deben ser encerrados entre comillas dobles.

El formato CSV es muy sencillo y no indica un juego de caracteres concreto, cómo van situados los bytes y ni tan si quera, el formato para el salto de línea. Estos puntos deben indicarse muchas veces al abrir el fichero, por ejemplo, con una hoja de cálculo.

/*     **************************************************************************************************************************************************************************************************
    FUNCIÓN PARA CONVERTIR UN ARRAY ASOCIATIVO EN UNA CADENA EN FORMATO CSV MS-DOS.
    PARÁMETROS:
    -----------
    $data        --> ES EL ARRAY FUENTE
    $separator    --> PARA SEPARAR LOS CAMPOS Y VALORES.
    $level        --> NO CAMBIAR. INDICA EL NODO DÓNDE ESTA. SE USA PARA EL PROCESO RECURSIVO.
    ***************************************************************************************************************************************************************************************************/
/**
 * Function for convert an array associative at CSV string.
 * @param string $data The source array.
 * @param string $separator Separator of fields and values.
 * @param int $level Indicates recursive level. 
 * @return string Returns a string separated by semicolons that corresponds with to structured a CSV file.
 */

function array2csv($arr,$separator=";", $level=0){
    $lines  = array();
    $xCount = 0;
    foreach ($arr as $key => $value) {
        if(is_array($value)){
            $lines[] = str_repeat($separator, $level).utf8_decode($key).array2csv($value, $separator, $level+1);
        } else {
            $lines[] = ($xCount==0?($level==0?"":$separator):str_repeat($separator, $level)).utf8_decode($key).$separator.utf8_decode($value);    
        }
        $xCount++;
    }
    return  implode("\n", $lines);
}

$arr = array("user" => "root", "user_id" => "1", "password" => "contraseña", "mensaje" => array("id" => "1", "descripcion" => "Descripción del texto", "prioridad" => "Media"));
$csv = array2csv($arr);
header("Content-type: text/csv; charset=utf-8");
header("Content-Disposition: attachment; filename=RequestResponse.csv");
header("Pragma: no-cache");
header("Expires: 0");
echo $csv;

Espero que os sea útil alguna vez.