сгладить многомерный массив в текст csv с помощью PHP

Я знаю, что это было задано довольно много раз, но это немного крутизна.

У меня есть многомерный массив, в котором ключом массива должно быть имя столбца для строки типа 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"; 

Надеюсь, это ясно. Спасибо за любую помощь.

Это гораздо более подробный, чем вам может понадобиться, но он позволяет иметь массив из 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; } 

(проверьте разговор в комментариях. Это действительно актуально.)

Что-то вроде этого, вероятно, приблизится к тому, что вы хотите (не проверено, просто уходит с моей головы):

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

Я сделал небольшой класс для этого: https://gist.github.com/981720

Вы можете включить его и создать csv следующим образом:

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

Это просто то же, что и Марк Б, но вы написали, что вы не хотели создавать файл для этого. Стрим Wrappers на помощь (не проверено, просто уходит с моей головы):

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