使用PHP将多维数组展平为csv文本

时间:2011-07-06 16:49:29

标签: php csv multidimensional-array

我知道这已被问过很多次了,但这有点麻烦。

我有一个多维数组,其中数组的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";

我希望这很清楚。谢谢你的帮助。

4 个答案:

答案 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);