我正在尝试创建一个数据分析门户,允许我将其中一个表格导出为CSV格式。我现在遇到的问题是,当用户选择大范围的数据时,它会失败,因为它已达到浏览器可用的Javascript变量的最大堆栈大小。 (正如here所述)。解决方案是将它们拆分为较小的Javascript数组块,然后再将它们连接起来。
我的问题
我有一个很大的PHP数组(可变大小,因为我不知道用户选择的范围),我需要将它们分成可变数量的Javascript数组,然后再将它们连接起来。我怎样才能做到这一点?
我的代码目前看起来像
<?php
$array2 = getAllRawData($startDate, $endDate, $merchantID);
array_unshift($array2, ...TO ADD HEADER TO CSV....));
?>
// I am thinking some magic is supposed to happen here that splits my PHP array into smaller parts, assign them to javascript arrays and then concatenate them together into items2.
var items2 = <?php echo json_encode($array2);?>; // this is what I currently do but fails when the date range gets too wide.
var jsonObject2 = JSON.stringify(items2);
var csv2 = ConvertToCSV(jsonObject2);
a=document.createElement('a');
a.textContent='Download Raw Waiting Time Report';
a.download="RawWaitTime.csv";
a.href='data:text/csv;charset=utf-8,'+escape(csv2);
document.body.appendChild(a);
答案 0 :(得分:4)
正如评论中所述,最好用PHP构建CSV。但是,要回答如何拆分Javascript数组的问题,可以使用窗口容器。但是,这意味着对象可能没有相同的Javascript限制,或者您链接的帖子不准确。 (我不确定,因为我没有看到也没有测试过这个限制错误。)
<script>
var Array0 = ["1", "2", "3"];
var Array1 = ["4", "5", "6"];
var Array2 = ["7", "8", "9"];
var Array3 = ["10", "11", "12"];
var Array4 = ["13", "14", "15"];
var ArrayCount = 5;
for (var x = 0; x < ArrayCount; x++) {
console.log(window["Array" + x]);
}
</script>
您可以通过PHP对这些数组进行切片:(未经测试)
<?php
$limit = 10000;
$arrayCount = count($array) % limit;
$offset = 0;
for ($x = 0; $arrayCount; $x++) {
echo "var MyArray{$x} = [" . implode(",", array_slice($array, $offset, $limit)) . "];";
$offset += $limit;
}
在不编写文件的情况下使用fputcsv:
<?php
$file = fopen("php://output", "w");
$array = [ [ "1", "2", "3" ], [ "4", "5", "6" ], [ "7", "8", "9" ] ];
foreach ($array as $value) {
fputcsv($file, $value);
}
答案 1 :(得分:0)
汤姆的回答很好。这是另一个解决方案,它也适用于生成CSV输出:
<?php
$array2 = getAllRawData($startDate, $endDate, $merchantID);
// This may or may not be necessary, depending on if you have
// objects mixed in with the value of $array2
$array2 = unserialize(serialize(json_decode(json_encode($array2), 1)));
print create_csv($array2);
function create_csv($input) {
$output = fopen("php://output", 'w');
function create_csv_handler(&$values, $key, $fh) {
fputcsv($fh, $values, ',', '"');
}
array_walk($input, 'create_csv_handler', $output);
fclose($output);
}