2013-10-28 63 views
1

我正在嘗試創建一個數據分析門戶,該門戶允許我將其中一個表導出爲CSV。我現在遇到的問題是,當用戶選擇大量數據時,它會失敗,因爲它已經達到了我的瀏覽器可用的Javascript變量的最大堆棧大小。 (如解釋here)。解決方案是將它們分成更小的Javascript數組塊,然後再將它們連接起來。將大的PHP數組分割爲更小的塊用於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

你爲什麼要經歷這一切?你不能直接從服務器提供CSV文件作爲下載嗎? – 2013-10-28 03:15:44

+1

同意Mike W.通常,當您將PHP代碼混合到Javascript代碼中時,您會過度複雜化某些內容。 – teynon

+0

嗯,我從來沒有想到,也許我會試一試。任何意見或指針,將非常感激! – chongzixin

回答

4

正如評論指出,這可能是最好建在CSV PHP。但是,要回答如何爲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); 
    } 
+0

非常感謝您的回答。因此,爲了允許作爲可下載的CSV文件,我應該將上面的fputcsv放到它自己的php文件中,並像這個鏈接中提到的那樣向它添加標題? (http://stackoverflow.com/questions/15769732/write-to-php-output-buffer-and-then-download-csv-from-buffer) – chongzixin

+0

@ user1258600是的。 – teynon

0

Tom很好的回答。以下是另一種可用於生成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); 
} 
+0

如果OP按照Javascript堆棧耗盡消息所建議的那樣處理大數據集,那麼使用該數組並伴隨函數調用的很可能會增加顯着的滯後時間。 – teynon

相關問題