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

使用PHP将多维数组展平为csv文本,php,csv,multidimensional-array,Php,Csv,Multidimensional Array,我知道这已经被问了好几次了,但这有点扭曲 我有一个多维数组,其中数组的键需要是平面csv类型字符串的列名(我不希望它作为文件,只是作为csv字符串) 所以是这样的: $data = array( dates = array ('2010-01-02','2011-02-03','2011-02-04'), type1 = array ('data1','data2','data3'), type2 =

我知道这已经被问了好几次了,但这有点扭曲

我有一个多维数组,其中数组的键需要是平面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";

我希望这是清楚的。谢谢您的帮助。

像这样的东西可能会接近您想要的(没有经过测试,只是超出了我的想象):

$fh=fopen('file.csv','w');
//写出标题
fputcsv($fh,数组_键($data));
//写出数据
对于($i=0;$i
这比您可能需要的详细得多,但它允许您拥有一个由n个元素组成的数组。基于同名的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;
}
$data=($data);
$r=(调用用户函数数组('zip',$data));
$fin=“”;
$fin.=内爆(',',数组键($data)).PHP\u EOL;
外汇($r作为$arr)
{
$fin.=内爆(',',$arr).PHP_EOL;
}
//$fin现在保存所有数据。用它做点什么,你就完了!
函数zip(){
$args=func_get_args();
$zipped=array();
$n=计数($args);

对于($i=0;$i我为此上了一堂小课:

您可以将其包括在内并生成csv,如下所示:


CSV::export($field\u names,$data,,,TRUE)

这只是与Marc B建议的相同,但是您写道您不想为此创建文件。将包装器流到救援中(未测试,只是超出了我的想象):

$fh=fopen('php://memory“,”rw');#不要创建文件,而是写入内存
//写出标题
fputcsv($fh,数组_键($data));
//写出数据
对于($i=0;$i
谢谢Marc--这是我应该做的,但我需要它作为字符串,而不是文件。@Marc--谢谢,但我用它向函数提供数据,不想让数据文件到处乱放(或处理清理)。在内存中打开文件,改为在磁盘上:
fopen('php://memory','rw')
只是说,这不会根据RFC生成有效的CSV。@如果您是对的,正确的行终止符是\r\n,这意味着上面的命令将在Windows中输出有效的CSV,但不是*nix.Uhm,假设您有一个包含冒号
或换行符或引号
甚至是这类的混合体。我认为与之相比,
PHP_EOL
是一个小问题。考虑一下,但这不符合OP的预期结果。不过,如果他愿意,他可以用
$fin.=内爆(',',$arr.).PHP_EOL;
替换为
$fin.='”。内爆(',“,”,$arr\n”
也就是说,对于实际的CSV(而不是类似CSV的CSV),使用PHP_EOL是不正确的,而不使用双引号是不明智的。此代码没有许可证,因此我无法使用。我只能在MIT、BSDL或非GPL的情况下使用它。
$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('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);