Конвертация CSV в JSON на PHP

312
30 июля 2021, 02:10

Учусь конвертировать csv файлы в формат json на php(который тоже знаю не очень), большая просьба помочь с алгоритмом. есть следующий csv фрагмент который упакован в файл data.csv :

Name;Art;Price
Товар 1;1001;10639
Товар 2;1002;23387
Товар 3;1003;20129
Товар 4;1004;14005
Товар 5;1005;49594
Товар 6;1006;20181
Товар 7;1007;37999
Товар 8;1008;29357
Товар 9;1009;49505
Товар 10;1011;11047
Товар 11;1012;18564

Очевидная задача получить JSON файл data.json следующего вида :

[
  {
    "Name": "Товар 1",
    "Art": 1001,
    "Price": 10639
  },
  {
    "Name": "Товар 2",
    "Art": 1002,
    "Price": 23387
  },
  {
    "Name": "Товар 3",
    "Art": 1003,
    "Price": 20129
  },
  {
    "Name": "Товар 4",
    "Art": 1004,
    "Price": 14005
  },
  {
    "Name": "Товар 5",
    "Art": 1005,
    "Price": 49594
  },
  {
    "Name": "Товар 6",
    "Art": 1006,
    "Price": 20181
  },
  {
    "Name": "Товар 7",
    "Art": 1007,
    "Price": 37999
  },
  {
    "Name": "Товар 8",
    "Art": 1008,
    "Price": 29357
  },
  {
    "Name": "Товар 9",
    "Art": 1009,
    "Price": 49505
  },
  {
    "Name": "Товар 10",
    "Art": 1011,
    "Price": 11047
  },
  {
    "Name": "Товар 11",
    "Art": 1012,
    "Price": 18564
  }
]

из csv файла я посредством

$csv = array_map('str_getcsv', file('data.csv'));

получил ассоциативный массив :

array(12) { 
[0]=> array(1) { [0]=> string(14) "Name;Art;Price" }  
[1]=> array(1) { [0]=> string(23) "Товар 1;1001;10639" }   
[2]=> array(1) { [0]=> string(23) "Товар 2;1002;23387" }     
[3]=> array(1) { [0]=> string(23) "Товар 3;1003;20129" }   
[4]=> array(1) { [0]=> string(23) "Товар 4;1004;14005" }   
[5]=> array(1) { [0]=> string(23) "Товар 5;1005;49594" }   
[6]=> array(1) { [0]=> string(23) "Товар 6;1006;20181" }   
[7]=> array(1) { [0]=> string(23) "Товар 7;1007;37999" }   
[8]=> array(1) { [0]=> string(23) "Товар 8;1008;29357" }   
[9]=> array(1) { [0]=> string(23) "Товар 9;1009;49505" }   
[10]=> array(1) { [0]=> string(24) "Товар 10;1011;11047" }   
[11]=> array(1) { [0]=> string(24) "Товар 11;1012;18564" }   
}

Понимаю что следующей итерацией мне необходимо данный массив перебрать и привести к образцу, но не понимаю как это сделать. Собственно просьба о помощи в подсказке правильного цикла для данного действия. А может быть я что то делаю не так, Спасибо

Answer 1

В целом это будет так:

$json_array = [];
$lines = file('data.csv', FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);
// Получаем первую строку с заголовками
$headers = array_shift($lines);
// Делаем из нее массив
$headers = str_getcsv($headers, ';');  // Укажите использующийся разделитель
foreach ($lines as $line) {
    $json_array[] = array_combine(
        $headers,    
        str_getcsv($line, ';'),  // Укажите использующийся разделитель
    );
}
echo json_encode($json_array);

Через array_map вы не сможете передать разделитель ;.

Answer 2

Для начала надо научиться читать csv. Причем не скопипастив код неизвестно откуда, а вдумчиво разобравшись. Для этого гуглим свою задачу, берем пример с соответствующей страницы мануала и адаптируем под себя.

$handle = fopen("z.csv", "r");
$headers = [];
$result = [];
while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
    if (!$headers) {
        $headers = $data;
    } else {
        $result[] = array_combine($headers, $data);
    }
}
Answer 3

если хочется перебирать массив, то $array - это массив который получился

<?php
$array = [
    ['name;price'],
    ['milk;10'],
    ['chocolate;8'],
    ];
$res = [];
// получаем подмассив с оглавлением и заодно убираем оглавление из массива
$firstLine = array_shift($array); 
$keys = explode(";", $firstLIne[0]); // разбиваем его на ключи
foreach ($array as $line) {
  //собираем массив из двух, где первый массив - ключи, второй значения
  $res[] = array_combine( 
    $keys, 
    explode(';', $line[0])
  );
}
//конвертируем результат в json
$json = json_encode($res);
echo $json;
//выводит [{"name":"milk","price":"10"},{"name":"chocolate","price":"8"}]
Answer 4
    $fo1 = fopen("lun.csv", "r");

    $fd1 = fread($fo1, filesize("lun.csv"));

    fclose($fo1);
    // Делаем массивы строк
    $da1 = explode("\r\n", $fd1);
    $chery=count($da1);
    for($i = 0; $i <= $chery-1; $i++) {
    $da2[]=explode(";", $da1[$i]);
    // Выводим нужные строки

    $arri=array('Name','Art','Price');
    foreach($arri as $key =>$val){
    $arrl[$val]=$da2[$i][$key];
    }
    $arrt[]=$arrl;
    }
    print_r($arrt);
print_r(json_encode($arrt));
READ ALSO
После заполнения полей формы отправить файл на указанную почту

После заполнения полей формы отправить файл на указанную почту

Есть простая форма с двумя полями: телефон и emailНужно автоматически отправлять файл на почту, которую укажет пользователь в поле email

133
Правильно ли построен код на OOP

Правильно ли построен код на OOP

Начал учить ООП php и вроде написал код который работает, но на 100% уверен что с ним что-то не так, но что именно не поймуЭто мини система авторизации...

104
Как реализовать авторизацию по ролям?

Как реализовать авторизацию по ролям?

Имеется страница авторизации и база данных с таблицей пользователей и таблицей ролей этих пользователейТаблицы связаны внешним ключом

274