Как я могу хранить большие куски в json файле без памяти cra sh? - PullRequest
3 голосов
/ 04 февраля 2020

У меня есть массив $table, и он содержит 6000 элементов. Когда я хочу преобразовать этот массив в json и сохранить его в файл, моя память падает. Поэтому у меня возникла идея разбить массив на куски по 500 элементов:

$table = array_chunk($table, 500);

$table_json = $serializer->serialize($table[0], 'json', $context);

$myfile = fopen($_SERVER['DOCUMENT_ROOT']."/files/myfile.json", "w") or die("Unable to open file!");
file_put_contents($_SERVER['DOCUMENT_ROOT']."/files/myfile.json", $table_json);

Теперь это работает быстро, но, конечно, теперь хранится только 500 элементов. Есть ли способ добавить другие части массива $table без памяти cra sh?

Ответы [ 2 ]

1 голос
/ 06 февраля 2020

Вы могли бы сделать что-то вроде этого, как вы упомянули, вы знаете, как использовать array_chunk(); Давайте рассмотрим упрощение процесса с помощью встроенной функции PHP с именем array_chunk();

Мы будем использовать HTML столы для дизайна, который не рекомендуется. Задача лучше выполняется с помощью CSS, вы можете следовать тем же путем без HTML и CSS.

Наш стол:

id  datePosted  firstName   lastName    pictureName          anotherColumn
1   2013-07-01  John        Smith       SmithJohn.jpg        anotherValue
2   2013-05-06  Elroy       Johnson     JohnsonElroy.jpg     anotherValue
3   2013-06-18  Jake        Bible       BibleJake.jpg        anotherValue
4   2013-07-17  Steve       Stevenson   StevensonSteve.jpg   anotherValue
5   2013-04-08  Bill        Smith       SmithBill2.jpg       anotherValue

Building HTML Tables

Запрос PDO используется для получения информации базы данных с подготовленными операторами. Обратите внимание, что l oop генерирует только код для отображения столбцов. Тесты для определения того, где строки начинаются и заканчиваются, не нужны.

//INITIALIZE VARIABLES
$colsToDisplay = 3;
$htmlOutput    = array();

//GET PICTURE LIST
$sql = "SELECT datePosted, firstName, lastName, pictureName FROM pictureList ORDER BY datePosted DESC";
$stmt = $pdo->prepare($sql);
$stmt->execute();
while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
     $htmlOutput[] = "<td><img src='images/{$row['pictureName']}' alt='' /><br />{$row['firstName']} {$row['lastName']}</td>";
}

После выполнения l oop массив, содержащий информацию о столбце, можно разбить на группы по три ... или любое другое значение было присвоено $colsToDisplay, Что мы здесь сделали? мы убираем 3 столбца из таблицы, поэтому разделим таблицу на две части.

while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
     //...
}

//BREAK THE COLUMNS INTO GROUPS
$htmlOutput = array_chunk($htmlOutput, $colsToDisplay);

Осталось только отобразить информацию таблицы , Обратите внимание, что array_chunk () создает многомерный массив. Foreach l oop используется для обработки групп столбцов. Каждой группе присваивается $currRow, который содержит массив столбцов для текущей строки. Функция implode () используется для быстрого отображения столбцов в виде строки.

Продолжаем:

//BREAK THE COLUMNS INTO GROUPS
$htmlOutput = array_chunk($htmlOutput, $colsToDisplay);

//DISPLAY TABLE
print '<table>';
foreach($htmlOutput as $currRow) {
     print '<tr>' . implode('', $currRow) . '</tr>';
}
print '</table>';

Проверка Для отсутствующих тегов столбцов

Одна вещь, которую вы, возможно, заметили, - это код для добавления отсутствующих столбцов. Другими словами, этот пример приводит к таблице HTML, в которой последняя строка содержит только два столбца.

Очевидно, что пропущенные столбцы не нужны в соответствии с W3 C Службой проверки разметки … поэтому они не были включены. Однако их можно добавить, выполнив следующий код непосредственно перед вызовом array_chunk().

$colsDifference = count($htmlOutput) % $colsToDisplay;
if($colsDifference) {
     while($colsDifference < $colsToDisplay) {           
        $htmlOutput[] = '<td></td>';           
        $colsDifference++;
    } 
} 

Окончательный код:

    //INITIALIZE VARIABLES
    $colsToDisplay = 3;
    $htmlOutput    = array();


    //GET PICTURE LIST
    $sql = "SELECT datePosted, firstName, lastName, pictureName FROM pictureList ORDER BY datePosted DESC";
    $stmt = $pdo->prepare($sql);
    $stmt->execute();
    while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
         $htmlOutput[] = "<td><img src='images/{$row['pictureName']}' alt='' /><br />{$row['firstName']} {$row['lastName']}</td>";
    }

    //OPTIONAL CODE
    //IF NEEDED, ADD MISSING COLUMNS
    $colsDifference = count($htmlOutput) % $colsToDisplay;
    if($colsDifference) {
         while($colsDifference < $colsToDisplay) {           
            $htmlOutput[] = '<td></td>';           
            $colsDifference++;      
        }
    } 
        //END: OPTIONAL CODE  
        //BREAK THE COLUMNS INTO GROUPS 
   $htmlOutput = array_chunk($htmlOutput, $colsToDisplay);   
        //DISPLAY TABLE print '<table>'; 

    foreach($htmlOutput as $currRow) {      
        print '<tr>' . implode('', $currRow) . '</tr>'; 
    } 
    print '</table>'; 

Идея За этим учебным пособием:

  1. Вам не нужно создавать файл и записывать в него массивы для отображения в виде данных.
  2. Если вы все еще хотите это сделать (разделите таблицу из двух частей) создать два массива и записать их в файл, а затем использовать array_push(); или array_merge();, чтобы объединить оба массива в один. Надеюсь, что это поможет вам в вашей жизни кодирования:)
1 голос
/ 04 февраля 2020

Придерживаясь своего решения, вы можете добавить другие куски в свой существующий файл. Это работает путем установки флага FILE_APPEND, например:

$table_json = $serializer->serialize($table[1], 'json', $context);
$myfile = fopen($_SERVER['DOCUMENT_ROOT']."/files/myfile.json", "w") or die("Unable to 
open file!");
file_put_contents($_SERVER['DOCUMENT_ROOT']."/files/myfile.json", $table_json, FILE_APPEND | LOCK_EX);

(LOCK_EX флаг, чтобы запретить кому-либо писать в файл одновременно)

...