将大PHP数组拆分为javascript的较小块

时间:2013-10-28 03:08:53

标签: javascript php arrays

我正在尝试创建一个数据分析门户,允许我将其中一个表格导出为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);

2 个答案:

答案 0 :(得分:4)

正如评论中所述,最好用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);
    }

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