Как реализовать на php экспорт данных вида json из SQL — в csv?

Коллеги, есть функция, которая экспортирует данные с таблицы БД в csv. Все хорошо работает пока не натыкается на ячейку, в которой находятся данные в виде json.
function process_export_csv($array, $file_name = 'data') {

    if(isset($_GET['export']) && $_GET['export'] == 'csv') {

        header('Content-Disposition: attachment; filename="' . $file_name . '.csv";');
        header('Content-Type: application/csv; charset=UTF-8');

        $csv = csv_exporter($array);

        die($csv);
    }

}

function csv_exporter($array) {

    $result = '';
    
    /* Экспорт заголовка */
    $headers = [];
    foreach(array_keys((array) reset($array)) as $value) {
            $headers[] = '"' . $value . '"';
    }

    $result .= implode(',', $headers);

    /* Данные */
    foreach($array as $row) {
        $result .= "\n";

        $row_array = [];

        foreach($row as $key => $value) {
            
                $row_array[] = '"' . addslashes($value) . '"';
            
        }

        $result .= implode(',', $row_array);
    }

    return $result;
}

function csv_link_exporter($csv) {
    return 'data:application/csv;charset=utf-8,' . urlencode($csv);
}

в тоже самое время - есть функция, которой экспортирую эту же таблицу БД в json:
function process_export_csv($array, $file_name = 'data') {

    if(isset($_GET['export']) && $_GET['export'] == 'csv') {


        header('Content-Disposition: attachment; filename="' . $file_name . '.csv";');
        header('Content-Type: application/csv; charset=UTF-8');

        $csv = csv_exporter($array);

        die($csv);
    }

}

function csv_exporter($array) {

    foreach($array as $object) {

        foreach($object as $key => $value) {

            
        }

    }

    return csv_encode($array);
}


Есть ли способ/идеи - как можно дописать функцию для экспорта в csv, чтобы она натыкаясь на данные json -разбивала их либо на отдельные столбики, либо как-то массивом записывала в одну ячейку? В идеале, разбивать столбики на "Название таблицы/key" а в ячейку писать value.
Вот пример ячейки, на которой спотыкается функция экспорта:
{"email":"email@gmail.com","name":"Вася","phone":"+79987987987"}
  • Вопрос задан
  • 69 просмотров
Пригласить эксперта
Ответы на вопрос 2
vitaly_74
@vitaly_74
не читал весь ваш код, но, добавьте себе вот эту функцию:
function isJson($string) {
   json_decode($string);
   return json_last_error() === JSON_ERROR_NONE;
}

она будет вам указывать является ли строка в ячейке json строкой.
следовательно:
/* Данные */
    foreach($array as $row) {
        $result .= "\n";

        $row_array = [];
        if(isJson($row)){
              $row = json_decode($row); //это массив.
        }
        foreach($row as $key => $value) {
            
                $row_array[] = '"' . addslashes($value) . '"';
            
        }

        $result .= implode(',', $row_array);
    }
Ответ написан
Комментировать
@rPman
Ты неправильно создаешь csv, строки в валидном csv могут содержать \n и разделитель (дублируется), используй штатную функцию fputcsv, записывающую строчку в файл (аналогично читать fgetcsv)

Для json потоково одним проходом не получится, не зная структуры этих json для csv нужно будет два прохода: первый - определяет все возможные колонки (и если надо сохраняет значения), а второй - заполняет массив строки (для передачи fputcsv) пустыми значениями для тех колонок, значения которых отсутствуют. Чтобы порядок был верный первый проход должен сформировать массив - список названий колонок, а второй проход в цикле формирует массив пробегая по этому массиву названий колонок.

p.s. а у тебя в json точно только один уровень? если есть вложенности на это нужно проверку делать и как то реагировать
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы