Как преобразовать массив в файл CSV?
Это мой массив:
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 ) ) ) ) )
Я использую для этого следующую функцию; это адаптация от одной из записей человека в комментариях fputscsv. И вы, вероятно, захотите сгладить этот массив; не уверен, что произойдет, если вы пройдете многомерную.
/** * 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 ); }
Мое решение требует, чтобы массив был отформатирован иначе, чем заданный в вопросе:
<? $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' ), ); ?>
Мы определяем нашу функцию:
<? function outputCSV($data) { $outputBuffer = fopen("php://output", 'w'); foreach($data as $val) { fputcsv($outputBuffer, $val); } fclose($outputBuffer); } ?>
Затем мы выводим наши данные в виде CSV:
<? $filename = "example"; header("Content-type: text/csv"); header("Content-Disposition: attachment; filename={$filename}.csv"); header("Pragma: no-cache"); header("Expires: 0"); outputCSV($data); ?>
Я использовал это с несколькими проектами, и он работает хорошо. Я должен отметить, что код outputCSV
более умный, чем я, поэтому я уверен, что я не автор. К сожалению, я потерял информацию о том, где я его получил, поэтому я не могу отдать должное тем, кому это нужно.
Небольшая адаптация к решению выше Kingjeffrey для того, когда вы хотите создать и повторить CSV в шаблоне (Ie – большинство фреймворков будет иметь выходную буферизацию, и вы должны установить заголовки и т. Д. В контроллерах.)
// 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);
Отклик на Kingjeffrey выше, а также на это сообщение в блоге, где я нашел информацию о создании текстовых потоков.
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>' ;
Ну, может быть, немного поздно после 4 лет ха-ха … но я искал решение для OBJECT для CSV, однако большинство решений здесь для ARRAY для CSV …
После некоторого возиться, вот мое решение для преобразования объекта в CSV, я думаю, это довольно аккуратно. Надеюсь, это поможет кому-то другому.
$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);
Обратите внимание, что для работы $key => $value
атрибуты вашего object
должны быть общедоступными, частные не будут получать.
В результате вы получите что-то вроде этого:
blah,blah,blah blah,blah,blah