2011-07-06 19 views
2

我知道這已被問了很多次,但這有點兒麻煩。使用PHP將多維數組壓縮爲csv文本

我有一個多維數組,其中的數組的鍵需要是一個扁平的csv類型的字符串的列名(我不希望它作爲一個文件,就像一個csv字符串)。

所以是這樣的:

$data = array(
       dates = array ('2010-01-02','2011-02-03','2011-02-04'), 
       type1 = array ('data1','data2','data3'), 
       type2 = array ('data4','data5','data6') 
); 

最終的結果應該是:

$new_data = "dates,type1,type2" . "\n" 
$new_data .= "2010-01-02,data1,data4" . "\n" 
$new_data .= "2011-02-03,data2,data5" . "\n" 
$new_data .= "2011-02-04,data3,data6"; 

我希望這是顯而易見的。謝謝你的幫助。

回答

0

這是更爲詳細的比你可能永遠需要的,但它允許你有一個n個元素的數組。 zip基於相同名稱的Python函數。我沒有寫。

$data = ($data); 
$r = (call_user_func_array('zip', $data)); 

$fin = ""; 
$fin .= implode(',',array_keys($data)).PHP_EOL; 
foreach($r as $arr) 
{ 
    $fin .= implode(',',$arr).PHP_EOL; 
} 

// $fin now holds all the data. Do something with it and you're finished! 

function zip() { 
    $args = func_get_args(); 
    $zipped = array(); 
    $n = count($args); 
    for ($i=0; $i<$n; ++$i) { 
     reset($args[$i]); 
    } 
    while ($n) { 
     $tmp = array(); 
     for ($i=0; $i<$n; ++$i) { 
      if (key($args[$i]) === null) { 
       break 2; 
      } 
      $tmp[] = current($args[$i]); 
      next($args[$i]); 
     } 
     $zipped[] = $tmp; 
    } 
    return $zipped; 
} 

(檢查出的意見談話這真的很重要。)

+0

這是完美的 - 非常感謝! – julio

+0

只是說,根據RFC不會生成有效的CSV。 – hakre

+0

@hakre你是對的,正確的行結束符是\ r \ n,這意味着上面的將在Windows中輸出有效的CSV,而不是* nix。 – cwallenpoole

1

像這樣的東西可能會接近你想要什麼(未測試,只是要了我的頭頂部):

$fh = fopen('file.csv', 'w'); 

// write out the headers 
fputcsv($fh, array_keys($data)); 

// write out the data  
for ($i = 0; $i < count($data['dates']); $i++) { 
    $temp = array($data['dates'][$i], $data['type1'][$i], $data['type2'][$i]); 
    fputcsv($fh, $temp); 
} 
+0

謝謝馬克思 - 這是我會做的,但我需要它作爲一個字符串,而不是一個文件。 – julio

+0

'$ string = file_get_contents('file.csv')'after after ... –

+0

@ marc--謝謝,但我使用它將數據提供給一個函數,並且不想讓數據文件擱置(或處理清理)。 – julio

0

我做了一個小的類這樣做的:https://gist.github.com/981720

可以包括它併產生像這樣的CSV:

CSV::export($field_names, $data, '', TRUE)

+0

這段代碼沒有許可證,所以對我來說是無法使用的,我只能使用它,如果它是MIT或BSDL或非GPL的東西。 –

0

這僅僅是因爲馬克乙建議,但是你寫的,你沒有想創造相同這是一個文件。流包裝拯救(沒有測試,只是去我的頭頂):

$fh = fopen('php://memory', 'rw'); # don't create a file, write to memory instead 

// write out the headers 
fputcsv($fh, array_keys($data)); 

// write out the data  
for ($i = 0; $i < count($data['dates']); $i++) { 
    $temp = array($data['dates'][$i], $data['type1'][$i], $data['type2'][$i]); 
    fputcsv($fh, $temp); 
} 
rewind($fh); 
$string = stream_get_contents($fh); 
fclose($fh);