我知道这已被问过很多次了,但这有点麻烦。
我有一个多维数组,其中数组的Key需要是flat csv-type字符串的列名(我不希望它作为文件,就像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 :(得分: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);
}
答案 1 :(得分: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;
}
(查看评论中的对话。这非常重要。)
答案 2 :(得分:0)
我为此做了一个小课:https://gist.github.com/981720
你可以包含它并像这样生成csv:
CSV::export($field_names, $data, '', TRUE)
答案 3 :(得分:0)
这与Marc B建议的相同,但是您写道,您不想为此创建文件。 Stream 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);