write w3schools fputs array php arrays csv

fputs - php csv w3schools



Convertir matriz en csv (5)

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

Después de algunos retoques, aquí está 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 que el $key => $value funcione, los atributos de su object deben ser públicos, los privados no se recuperarán.

El resultado final es que obtienes algo como esto:

blah,blah,blah blah,blah,blah

¿Cómo convertir una matriz en un archivo 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 ) ) ) ) )


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 ); }


Mi solución requiere que la matriz se formatee de forma diferente a la que se proporciona 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'' ), ); ?>

Nosotros definimos nuestra función:

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

Luego damos salida a nuestros datos como un 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.


Una ligera adaptación de Kingjeffrey a la solución anterior para cuando desee crear y repetir el CSV dentro de una plantilla (es decir, la mayoría de los marcos tendrán habilitado el almacenamiento en búfer de salida y deberá establecer encabezados, 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);

Gracias a Kingjeffrey y también a esta publicación de blog donde encontré información sobre cómo crear secuencias de texto.


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>'' ;