将大的PHP数组拆分为较小的块用于JavaScript


splitting big PHP array into smaller chunks for javascript

我正在尝试创建一个数据分析门户,该门户允许我将其中一个表导出为CSV。我现在遇到的问题是,当用户选择大量数据时,它会失败,因为它已经达到了我的浏览器可用的 Javascript 变量的最大堆栈大小。(如此处所述)。解决方案是将它们拆分为较小的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);

如注释中所述,最好在PHP中构建CSV。但是,要回答如何拆分Javascript数组的问题,您可以使用窗口容器。但是,这意味着对象可能没有相同的Javascript限制,或者您链接到的帖子不准确。(我不确定,因为我没有看到也没有测试过这个限制错误。

http://jsfiddle.net/TYwY8/7/

<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);
    }

汤姆的好答案。这是另一个解决方案,它也适用于生成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);
}