Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-按列从数组到CSV_Php_Arrays_Csv_Fputcsv - Fatal编程技术网

PHP-按列从数组到CSV

PHP-按列从数组到CSV,php,arrays,csv,fputcsv,Php,Arrays,Csv,Fputcsv,问题:我有一个关联数组,其中所有键表示csv头和每个$key=>数组中的值。。表示该列中的项目 研究:据我所知,fputcsv喜欢一行一行地进行,但这种基于列的数组使得这一点变得复杂起来。我还没有找到任何可以实现这一点的功能 示例: Array( ['fruits'] => Array( [0] => 'apples', [1] => 'oranges', [2] => 'bananas' ), ['

问题:我有一个关联数组,其中所有键表示csv头和每个$key=>数组中的值。。表示该列中的项目

研究:据我所知,fputcsv喜欢一行一行地进行,但这种基于列的数组使得这一点变得复杂起来。我还没有找到任何可以实现这一点的功能

示例:

Array(
    ['fruits'] => Array(
        [0] => 'apples',
        [1] => 'oranges',
        [2] => 'bananas'
    ),
    ['meats'] => Array(
        [0] => 'porkchop',
        [1] => 'chicken',
        [2] => 'salami',
        [3] => 'rabbit'
    ),
)
fruits,meats
apples,porkchop
oranges,chicken
bananas,salami
,rabbit
需要变成:

Array(
    ['fruits'] => Array(
        [0] => 'apples',
        [1] => 'oranges',
        [2] => 'bananas'
    ),
    ['meats'] => Array(
        [0] => 'porkchop',
        [1] => 'chicken',
        [2] => 'salami',
        [3] => 'rabbit'
    ),
)
fruits,meats
apples,porkchop
oranges,chicken
bananas,salami
,rabbit
为什么这么难:

Array(
    ['fruits'] => Array(
        [0] => 'apples',
        [1] => 'oranges',
        [2] => 'bananas'
    ),
    ['meats'] => Array(
        [0] => 'porkchop',
        [1] => 'chicken',
        [2] => 'salami',
        [3] => 'rabbit'
    ),
)
fruits,meats
apples,porkchop
oranges,chicken
bananas,salami
,rabbit

您需要知道生成空白点的最大行数。

我必须编写自己的函数。我想这可能会帮助别人

/*
 * The array is associative, where the keys are headers
 * and the values are the items in that column.
 * 
 * Because the array is by column, this function is probably costly.
 * Consider a different layout for your array and use a better function.
 * 
 * @param $array array The array to convert to csv.
 * @param $file string of the path to write the file.
 * @param $delimeter string a character to act as glue.
 * @param $enclosure string a character to wrap around text that contains the delimeter
 * @param $escape string a character to escape the enclosure character.
 * @return mixed int|boolean result of file_put_contents.
 */

function array_to_csv($array, $file, $delimeter = ',', $enclosure = '"', $escape = '\\'){
    $max_rows = get_max_array_values($array);
    $row_array = array();
    $content = '';
    foreach ($array as $header => $values) {
    $row_array[0][] = $header;
    $count = count($values);
    for ($c = 1; $c <= $count; $c++){
        $value = $values[$c - 1];
        $value = preg_replace('#"#', $escape.'"', $value);
        $put_value = (preg_match("#$delimeter#", $value)) ? $enclosure.$value.$enclosure : $value;
        $row_array[$c][] = $put_value;
    }
    // catch extra rows that need to be blank
    for (; $c <= $max_rows; $c++) {
        $row_array[$c][] = '';
    }
    }
    foreach ($row_array as $cur_row) {
    $content .= implode($delimeter,$cur_row)."\n";
    }
    return file_put_contents($file, $content);
}
/*
*数组是关联的,其中键是标题
*值就是该列中的项目。
* 
*因为数组是按列排列的,所以此函数可能代价高昂。
*为数组考虑不同的布局,并使用更好的功能。
* 
*@param$array数组要转换为csv的数组。
*@param$file写入文件路径的字符串。
*@param$delimeter字符串用作粘合剂的字符。
*@param$enclosure string一个字符,用于环绕包含delimeter的文本
*@param$转义字符串用于转义封闭字符的字符。
*@return文件内容的混合int |布尔结果。
*/
函数数组\u到\u csv($array,$file,$delimeter=',',$enclosure=',$escape='\\'){
$max\u rows=获取\u max\u数组\u值($array);
$row_array=array();
$content='';
foreach($array as$header=>$values){
$row_数组[0][]=$header;
$count=计数($value);
对于($c=1;$c
$data=array)(
'水果'=>数组(
“苹果”,
“橙子”,
“香蕉”
),
'meats'=>数组(
“porkchop”,
“鸡”,
“意大利腊肠”,
“兔子”
),
);
$combled=数组(数组(“水果”、“肉类”);
对于($i=0;$i
转换为csv和解析数组可以在同一个循环中完成。或者您的意思是可能有更多的列?对于数组的常规类型,可以轻松修改此代码。就像这样,对于任意数量的列

$data = array(
    'fruits' => array(
        'apples',
        'oranges',
        'bananas'
    ),
    'meats' => array(
        'porkchop',
        'chicken',
        'salami',
        'rabbit'
    ),
);
$heads = array_keys($data);
$maxs = array();
foreach($heads as $head)
  $maxs[] = count($data[$head]);
ob_start();
$fp = fopen('php://output', 'w');
fputcsv($fp, $heads);
for($i = 0; $i < max($maxs); $i++)
{   
    $row = array(); 
    foreach($heads as $head)
       $row[] = isset($data[$head][$i]) ? $data[$head][$i] : '';
    fputcsv($fp, $row);   
}
fclose($fp);
$data = ob_get_clean();
var_dump($data);
$data=array(
'水果'=>数组(
“苹果”,
“橙子”,
“香蕉”
),
'meats'=>数组(
“porkchop”,
“鸡”,
“意大利腊肠”,
“兔子”
),
);
$heads=数组_键($data);
$maxs=array();
foreach($heads作为$head)
$maxs[]=计数($data[$head]);
ob_start();
$fp=fopen('php://output","w",;
fputcsv($fp,$heads);
对于($i=0;$i
效果很好。不过请接受您的答案。在接受我自己的答案之前,我正在等待-因为有人可能会有更好的答案:DBoth在
preg\u匹配上失败
“警告:preg\u match()希望参数2是字符串,数组给定。。。“结果:col1、col2、col3\n数组、数组我以前没有遇到过这个问题……为什么第二个参数是数组?它应该是字符串?数据的结构是什么?现在的问题是,这些解决方案中哪一个成本更低/效率更高-尤其是对于大型数组(大量列)@amurrell我的代码应该可以处理巨大的数组,没有问题,中间数据不存储在任何地方,没有正则表达式。可以改进的一件事是移动max()从循环到单独的变量。它只是逐行读取,用空字符串替换缺少的项目,并将每行转换为csv行,而不是其他任何内容。输出缓冲只是为了将csv字符串存储到变量中,您可以不使用它直接保存到文件中。