2010-10-14 21 views
36

Jak przekonwertować tablicę na plik CSV?Konwertuj tablicę na csv

To moja tablica:

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

może chcesz oznaczyć to pytanie co język Twój kod został napisany w To pomoże Ci uzyskać więcej gałek ocznych sposób na swoje pytanie. :) –

+2

Nie sądzę, że istnieje sposób na prezentowanie wielowymiarowości w CSV, prawda? – Hannes

+2

Zobacz także [to rozwiązanie] (http://stackoverflow.com/a/13474770/57091), które używa 'fputcsv()' w połączeniu z 'ob_start(); $ df = fopen ("php: // output", "w"); fclose ($ df); return ob_get_clean(); '. – robsch

Odpowiedz

72

używam następującą funkcję do tego; jest to adaptacja jednego z wpisów man w komentarzach fputscsv. Prawdopodobnie będziesz chciał spłaszczyć tę tablicę; nie jestem pewien, co się stanie, jeśli przejdziesz w trybie wielowymiarowym.

/** 
    * 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

Cześć Paul, Dzięki temu bardzo mi pomaga. Twoja najlepsza! : D – rayss

+0

Cześć, to działa dla mnie. Ale mam pytanie, jak zrobić, aby utworzyć nową linię po 1 rzędzie? Dodałem licznik w pętli for i jeśli jest to koniec pierwszego indeksu, dołączam nową linię, taką jak ta $ output [$ i].= "\ r \ n"; tworzy nową linię, ale dodała też jedną nową komórkę w kolejnych wierszach. – user1149244

+0

Wow, to jest świetne! Dziękujemy! –

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

Cześć Paulrajj, dziękuję bardzo. naprawdę pomagasz mojemu problemowi. twój wspaniały koleś! : D – rayss

41

Moje rozwiązanie wymaga tablicę być sformatowane inaczej niż przewidziane w pytaniu:

<? 
    $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'), 
    ); 
?> 

definiujemy naszą funkcję:

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

Potem wyjściowe nasze dane jako CSV:

<? 
    $filename = "example"; 

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

    outputCSV($data); 
?> 

Używałem tego przy kilku projektach i działa dobrze. Powinienem zauważyć, że kod outputCSV jest bardziej sprytny niż ja, więc jestem pewien, że nie jestem oryginalnym autorem. Niestety straciłem orientację, skąd ją otrzymałem, więc nie mogę dać kredytu temu, komu się to należy.

15

Nieznaczne adaptacja do roztworu powyżej kingjeffrey gdy chcesz stworzyć i echo CSV w szablonie (Tj. - większość ramy będą miały buforowanie wyjścia włączona i jesteś zobowiązany do ustawienia nagłówków itp kontrolerami)

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

Podziękowania dla Kingjeffrey powyżej, a także dla tego blog post, gdzie znalazłem informacje o tworzeniu strumieni tekstu.

+3

To rozwiązanie jest użyteczne tam, gdzie uprawnienia do tworzenia plików są niedozwolone – DKG

-2

No może trochę późno po 4 latach haha ​​... ale szukałem rozwiązania, aby zrobić OBIEKT do CSV, jednak większość rozwiązań jest tu rzeczywiście do tablicy do pliku CSV ...

Po pewnym majsterkowania, tutaj jest moim rozwiązaniem do konwersji obiektu do CSV, myślę, że jest całkiem schludny. Mam nadzieję, że to pomoże komuś innemu.

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

pamiętać, że do $key => $value do pracy, atrybuty object „s muszą być publiczne, prywatne nich nie dostanie naciągane.

Końcowym rezultatem jest to, że można dostać coś takiego:.

blah,blah,blah 
blah,blah,blah