2010-10-14 14 views
36

Diziyi CSV dosyasına dönüştürme nasıl? Diziyi csv'ye dönüştür

Bu

benim dizidir:

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

Sen kod yazıldığı hangi dili ile bu soruyu etiketlemek isteyebilirsiniz Yani sorunuza yol daha gözleri yardımcı olacaktır. :) –

+2

CSV'de çok boyutlulığı sunmanın bir yolu olduğunu düşünmüyorum, öyle mi? – Hannes

+2

Ayrıca bkz. “Bu çözüm” (http://stackoverflow.com/a/13474770/57091) 'fputcsv()' ile birlikte kullanılır ob_start(); $ df = fopen ("php: // output", "w"); fclose ($ df); geri dön ob_get_clean(); '. – robsch

cevap

72

Bunun için aşağıdaki işlevi kullanıyorum; Bu, fputscsv yorumlarındaki adam girişlerinden bir uyarlamasıdır. Ve muhtemelen bu diziyi düzleştirmek istersiniz; Çok boyutlu birinden geçerseniz ne olacağını emin değilim.

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

Merhaba Paul, Teşekkürler bana gerçekten çok yardımcı oluyor. En iyisi! : D – rayss

+0

Merhaba, bu benim için çalışıyor. Ama bir sorum var, 1 satırdan sonra yeni bir çizgi oluşturmak için nasıl yapabilirim? Kendi döngümde bir sayaç ekledim ve eğer ilk endeksin sonuysa, bu $ output [$ i] gibi yeni bir satır ekliyorum.= "\ r \ n"; Yeni bir satır oluşturur, ancak sonraki satırlara da yeni bir hücre ekledi. – user1149244

+0

wow bu harika! Teşekkür ederiz! –

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

Merhaba Paulrajj, Çok teşekkür ederim. gerçekten benim problemime yardım ediyorsun. senin harika dostum! : D – rayss

41

Çözümümün dizi gerektiriyor söz verilen daha farklı biçimlendirilmiş: CSV olarak

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

Sonra çıktı verilerimizi: Biz işlevini tanımlamak

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

<? 
    $filename = "example"; 

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

    outputCSV($data); 
?> 

Bunu birkaç proje ile kullandım ve iyi çalışıyor. outputCSV kodunun benden daha akıllı olduğuna dikkat etmeliyim, bu yüzden eminim ki orijinal yazar değilim. Ne yazık ki, nereden aldığımın izini kaybettim, bu yüzden kime ait olduğunu krediye veremem.

15

oluşturmak istediğiniz ve bir şablon içinde CSV yankı zaman için kingjeffrey yukarıdaki çözüme hafif adaptasyon (Yani -. En çerçeveler output ve denetleyicileri başlıkların vb ayarlamak için gerekli olacaktır)

// 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'e yukarıda ve ayrıca blog post numaralı telefona kredi akışları oluşturma hakkındaki bilgileri buldum.

+3

Bu çözüm, dosya oluşturma izinlerine izin verilmediğinde kullanışlıdır – DKG

-2

Eh belki biraz geç 4 yıl sonra haha ​​... ama burada, bazı müdahalesi sonrasında ... Burada ancak çoğu çözümler CSV DİZİ için aslında, CSV OBJECT yapmak çözüm için

bakıyordu nesneyi CSV'ye dönüştürmek için benim çözümüm, bence oldukça düzgün. Umarım bu bir başkasına yardım eder. $key => $value çalışması için, sizin object 'nin nitelikleri kamu olması gerektiğini

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

Not özel olanlar getirilen alamayacak.

Sonuçta

böyle bir şey elde ediyoruz:.

blah,blah,blah 
blah,blah,blah