2010-10-14 24 views
36

¿Cómo convertir una matriz en un archivo CSV?Convertir matriz en csv

Esta es mi matriz:

stdClass Object 
(

    [OrderList_RetrieveByContactResult] => stdClass Object 
     (
      [OrderDetails] => stdClass Object 
       (
        [entityId] => 1025298 
        [orderId] => 10952 
        [orderName] => testing 
        [statusTypeId] => 4652 
        [countryCode] => AU 
        [orderType] => 1 
        [invoiceNumber] => 0 
        [invoiceDate] => 0001-01-01T00:00:00 
        [userID_AssignedTo] => 11711 
        [shippingAmount] => 8.95 
        [shippingTaxRate] => 0 
        [shippingAttention] => 
        [shippingInstructions] => 
        [shippingOptionId] => 50161 
        [discountCodeId] => 0 
        [discountRate] => 0 
        [totalOrderAmount] => 408.45 
        [directDebitTypeId] => 0 
        [directDebitDays] => 0 
        [isRecur] => 
        [nextInvoiceDate] => 0001-01-01T00:00:00 
        [endRecurDate] => 0001-01-01T00:00:00 
        [cycleTypeID] => 1 
        [createDate] => 2010-10-08T18:40:00 
        [lastUpdateDate] => 2010-10-08T18:40:00 
        [deleted] => 
        [products] => stdClass Object 
         (
          [Product] => stdClass Object 
           (
            [productId] => 674975 
            [productCode] => 
            [productDescription] => 
            [units] => 10 
            [unitPrice] => 39.95 
            [unitTaxRate] => 0 
            [totalProductPrice] => 399.5 
            [productName] => Acne Clearing Gel 
           ) 

         ) 

        [addresses] => stdClass Object 
         (
          [Address] => stdClass Object 
           (
            [addressTypeID] => 8 
            [addressLine1] => Cebu City 
            [city] => Cebu 
            [zipcode] => 6000 
            [state] => 
            [countryCode] => PH 
           ) 

         ) 

       ) 

     ) 

) 
+3

es posible que desee marcar esta cuestión con el idioma que su código está escrito en que le ayudará a conseguir manera más ojos sobre su pregunta. :) –

+2

no creo que haya una manera de presentar la multi dimensionalidad en CSV, ¿verdad? – Hannes

+2

Vea también [esta solución] (http://stackoverflow.com/a/13474770/57091) que usa 'fputcsv()' junto con 'ob_start(); $ df = fopen ("php: // salida", "w"); fclose ($ df); return ob_get_clean(); '. – robsch

Respuesta

72

estoy usando la siguiente función para eso; es una adaptación de una de las entradas man en los comentarios fputscsv. Y probablemente quieras aplanar esa matriz; no estoy seguro de lo que sucede si pasas en uno multidimensional.

/** 
    * Formats a line (passed as a fields array) as CSV and returns the CSV as a string. 
    * Adapted from http://us3.php.net/manual/en/function.fputcsv.php#87120 
    */ 
function arrayToCsv(array &$fields, $delimiter = ';', $enclosure = '"', $encloseAll = false, $nullToMysqlNull = false) { 
    $delimiter_esc = preg_quote($delimiter, '/'); 
    $enclosure_esc = preg_quote($enclosure, '/'); 

    $output = array(); 
    foreach ($fields as $field) { 
     if ($field === null && $nullToMysqlNull) { 
      $output[] = 'NULL'; 
      continue; 
     } 

     // Enclose fields containing $delimiter, $enclosure or whitespace 
     if ($encloseAll || preg_match("/(?:${delimiter_esc}|${enclosure_esc}|\s)/", $field)) { 
      $output[] = $enclosure . str_replace($enclosure, $enclosure . $enclosure, $field) . $enclosure; 
     } 
     else { 
      $output[] = $field; 
     } 
    } 

    return implode($delimiter, $output); 
} 
+1

Hola Paul, Gracias realmente me ayuda mucho. ¡Eres el mejor! : D – rayss

+0

Hola, esto funciona para mí. Pero tengo una pregunta, ¿cómo puedo crear una nueva línea después de 1 fila? Agregué un contador en mi ciclo for y si es el final del primer índice, añado una nueva línea como esta $ salida [$ i].= "\ r \ n"; crea una nueva línea pero también agregó una nueva en las siguientes filas. – user1149244

+0

wow esto es genial! ¡Gracias! –

14
function array_2_csv($array) { 
    $csv = array(); 
    foreach ($array as $item) { 
     if (is_array($item)) { 
      $csv[] = array_2_csv($item); 
     } else { 
      $csv[] = $item; 
     } 
    } 
    return implode(',', $csv); 
} 

$csv_data = array_2_csv($array); 

echo "<pre>"; 
print_r($csv_data); 
echo '</pre>' ; 
+0

Hola Paulrajj, muchas gracias. realmente ayudas a mi problema tu increíble amigo! : D – rayss

41

Mi solución requiere la matriz un formato diferente que la proporcionada en la pregunta:

<? 
    $data = array(
     array('row_1_col_1', 'row_1_col_2', 'row_1_col_3'), 
     array('row_2_col_1', 'row_2_col_2', 'row_2_col_3'), 
     array('row_3_col_1', 'row_3_col_2', 'row_3_col_3'), 
    ); 
?> 

Definimos nuestra función:

<? 
    function outputCSV($data) { 
     $outputBuffer = fopen("php://output", 'w'); 
     foreach($data as $val) { 
      fputcsv($outputBuffer, $val); 
     } 
     fclose($outputBuffer); 
    } 
?> 

A continuación, salida de nuestros datos como un archivo CSV:

<? 
    $filename = "example"; 

    header("Content-type: text/csv"); 
    header("Content-Disposition: attachment; filename={$filename}.csv"); 
    header("Pragma: no-cache"); 
    header("Expires: 0"); 

    outputCSV($data); 
?> 

Lo he usado con varios proyectos, y funciona bien. Debo señalar que el código outputCSV es más inteligente que yo, así que estoy seguro de que no soy el autor original. Desafortunadamente, he perdido la pista de dónde lo obtuve, por lo que no puedo dar el crédito a quien se lo debo.

15

una ligera adaptación a la solución anterior por kingjeffrey para cuando se desea crear y hacerse eco de la CSV dentro de una plantilla (es decir, -. Mayoría de los marcos tendrá habilitado el almacenamiento en búfer de salida y usted está obligado a establecer cabeceras, etc en los controladores)

// Create Some data 
<?php 
    $data = array(
     array('row_1_col_1', 'row_1_col_2', 'row_1_col_3'), 
     array('row_2_col_1', 'row_2_col_2', 'row_2_col_3'), 
     array('row_3_col_1', 'row_3_col_2', 'row_3_col_3'), 
    ); 


// Create a stream opening it with read/write mode 
$stream = fopen('data://text/plain,' . "", 'w+'); 

// Iterate over the data, writting each line to the text stream 
foreach ($data as $val) { 
    fputcsv($stream, $val); 
} 

// Rewind the stream 
rewind($stream); 

// You can now echo it's content 
echo stream_get_contents($stream); 

// Close the stream 
fclose($stream); 

Crédito a Kingjeffrey arriba y también a este blog post donde encontré la información sobre cómo crear secuencias de texto.

+3

Esta solución es útil cuando no se permiten permisos para la creación de archivos – DKG

-2

Bueno, tal vez un poco tarde después de 4 años jaja ... pero yo estaba buscando una solución que ver OBJETO a CSV, sin embargo la mayoría de las soluciones aquí es en realidad para la matriz a CSV ...

Después de algunos retoques, aquí es mi solución para convertir objetos en CSV, creo que es bastante limpio. Espero que esto ayude a alguien más.

$resp = array(); 
foreach ($entries as $entry) { 
    $row = array(); 
    foreach ($entry as $key => $value) { 
     array_push($row, $value); 
    } 
    array_push($resp, implode(',', $row)); 
} 
echo implode(PHP_EOL, $resp); 

Tenga en cuenta que para la $key => $value a trabajar, sus atributos object 's deben ser públicas, las privadas no conseguirán descabellada.

El resultado final es que usted consigue algo como esto:.

blah,blah,blah 
blah,blah,blah