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