2010-10-14 48 views
36

Làm cách nào để chuyển đổi mảng thành tệp CSV?Chuyển đổi mảng thành csv

Đây là mảng của tôi:

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

Bạn có thể muốn gắn thẻ câu hỏi này với bất cứ ngôn ngữ mã của bạn được viết bằng đó sẽ giúp bạn có được cách dõi theo những câu hỏi của bạn. :) –

+2

tôi không nghĩ rằng có một cách để trình bày đa chiều trong CSV, là có? – Hannes

+2

Xem thêm [giải pháp này] (http://stackoverflow.com/a/13474770/57091) sử dụng 'fputcsv()' kết hợp với 'ob_start(); $ df = fopen ("php: // output", 'w'); fclose ($ df); return ob_get_clean(); '. – robsch

Trả lời

72

Tôi đang sử dụng các chức năng sau đây cho rằng; đó là một sự thích ứng từ một trong những mục nhập của người đàn ông trong các ý kiến ​​fputscsv. Và có thể bạn sẽ muốn làm phẳng mảng đó; không chắc chắn điều gì xảy ra nếu bạn vượt qua trong một chiều đa chiều.

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

Hi Paul, Cảm ơn nó thực sự giúp tôi rất nhiều. Tốt nhất của bạn! : D – rayss

+0

Xin chào, điều này phù hợp với tôi. Nhưng tôi có một câu hỏi, làm thế nào để tôi làm cho nó để tạo ra một dòng mới sau 1 hàng? Tôi thêm một truy cập trong vòng lặp của tôi và nếu nó là kết thúc của chỉ số đầu tiên, tôi nối thêm một dòng mới như đầu ra $ [$ i] này.= "\ r \ n"; nó tạo ra một dòng mới nhưng nó cũng thêm một ô mới vào các hàng tiếp theo. – user1149244

+0

wow điều này thật tuyệt! Cảm ơn bạn! –

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

Xin chào Paulrajj, Cảm ơn rất nhiều. bạn thực sự giúp đỡ vấn đề của tôi. anh chàng tuyệt vời của bạn! : D – rayss

41

Giải pháp của tôi đòi hỏi mảng được định dạng khác so với quy định trong câu hỏi:

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

Chúng tôi xác định chức năng của chúng tôi:

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

Sau đó, chúng tôi xuất dữ liệu của chúng tôi như một CSV:

<? 
    $filename = "example"; 

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

    outputCSV($data); 
?> 

Tôi đã sử dụng điều này với một số dự án, và nó hoạt động tốt. Tôi nên lưu ý rằng mã outputCSV thông minh hơn tôi, vì vậy tôi chắc chắn tôi không phải là tác giả gốc. Thật không may tôi đã mất dấu vết của nơi tôi đã nhận nó, vì vậy tôi không thể cung cấp cho các khoản tín dụng mà nó là do.

15

Một chút thích ứng với giải pháp trên bởi kingjeffrey khi bạn muốn tạo và lặp lại CSV trong một mẫu (tức là hầu hết các khung công tác sẽ được kích hoạt bộ đệm đầu ra và bạn được yêu cầu đặt tiêu đề vv trong bộ điều khiển.)

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

Tín dụng cho Kingjeffrey ở trên và cũng trong số này blog post nơi tôi tìm thấy thông tin về cách tạo luồng văn bản.

+3

Giải pháp này hữu ích khi không cho phép tạo tệp – DKG

-2

Cũng có thể muộn một chút sau 4 năm haha ​​... nhưng tôi đang tìm kiếm giải pháp để làm OBJECT để CSV, tuy nhiên hầu hết các giải pháp ở đây là thực sự cho ARRAY để CSV ...

Sau một số phiên bản, ở đây là giải pháp của tôi để chuyển đổi đối tượng thành CSV, tôi nghĩ là khá gọn gàng. Hy vọng điều này sẽ giúp người khác.

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

Lưu ý rằng đối với $key => $value để làm việc, thuộc tính object của bạn phải được công khai, những người tin sẽ không nhận lấy.

Kết quả cuối cùng là bạn có được một cái gì đó như thế này:.

blah,blah,blah 
blah,blah,blah 
Các vấn đề liên quan