2013-10-28 4 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-файл прямо с сервера в качестве загрузки? –

+1

Согласен с Майком В. Обычно, когда вы смешиваете 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

Хороший ответ от Тома. Вот еще одно решение, которое должно работать и для производства 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

Если ОП обрабатывает как можно больший набор данных, как это было предложено израсходованным сообщением в стеке Javascript, есть хорошая вероятность, что использование этого массива с вызовом функции добавит заметное время задержки. – teynon

Смежные вопросы