@html_student
Молодой и глупый.

Как поменять формат вывода json?

Есть такая функция
Код тут

protected function prepare_uploaded_file($resourcePath, $id){
	
		$response 			= new stdClass;
		$response->error 	= false;
		$products_count		= 10000000;
		$column_delimiter	= ';';
		$columns			= array();

		// Определяем колонки из первой строки файла
		$f = fopen($resourcePath, 'r');
		$columns = fgetcsv($f, 0, $column_delimiter);
		$columns = array_map(array($this,'convert'), $columns);
		$response->columns = $columns;

		// Массив импортированных товаров
		$imported_items = array();	

		// Превью товаров
		$preview_items = array();

		// Проходимся по строкам, пока не конец файла
		// или пока не импортировано достаточно строк для одного запроса
		for($k=0; !feof($f) && $k<$products_count; $k++)
		{
			// Читаем строку
			$line = fgetcsv($f, 0, $column_delimiter);
			$line = array_map(array($this,'convert'), $line);

			$product = $preview_product = null;			

			if(is_array($line)){
				
				// Проходимся по колонкам строки
				foreach($columns as $i=>$col)
				{
					if(isset($line[$i]) && !empty($line) && !empty($col)){
						$product[$i] = $line[$i];
					}
				}
				// Импортируем этот товар
				$imported_items[] = $product;

				// Создаем превью товара
				if($k<100){
					foreach($columns as $i=>$col)
					{
						if(isset($line[$i]) && !empty($line) && !empty($col))
							$preview_product[$i] = $line[$i];
					}
					$preview_items[] = $preview_product;
				}
			}
		}

		file_put_contents(sprintf(IMPORT_FILE, $id), json_encode($imported_items, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
		file_put_contents(sprintf(PREVIEW_FILE, $id), json_encode($preview_items, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
		fclose($f);

		return $response;
	}

	public function convert($str)
	{
		return iconv("Windows-1251", "UTF-8", $str);
	}


С ее помощью я разбираю файл csv который по итогу нужен мне в json. На выходе получаю такой файл json с содержанием
[
    [
        "Monthly Monitor индикатор PH мочи для кошек 453 г",
        "Ветеринарное оборудование и материалы -\/Диагностические средства -",
        "10718"
    ],
    [
        "KRUUSE катетер стерильный для кошек 1,0х130 мм со стилетом, 1 шт",
        "Ветеринарное оборудование и материалы -\/Расходные материалы -",
        "273453"
    ]
]

а мне требуется
[
    {
        "0":  "Monthly Monitor индикатор PH мочи для кошек 453 г",
        "1":  "Ветеринарное оборудование и материалы -\/Диагностические средства -",
        "2":  "10718"
    },
    {
        "0": "KRUUSE катетер стерильный для кошек 1,0х130 мм со стилетом, 1 шт",
        "1": "Ветеринарное оборудование и материалы -\/Расходные материалы -",
        "2": "273453"
    }
]


Не могу понять где ошибся
  • Вопрос задан
  • 116 просмотров
Решения вопроса 1
@alexalexes
Попробуйте использовать опцию JSON_FORCE_OBJECT в функции json_encode.
https://www.php.net/manual/ru/json.constants.php
Добавлено:
Ну, тогда item-ы кодируйте стандартной функцией, а сборку массива делайте кастомную:
$imported_items[] = json_encode($product, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_FORCE_OBJECT);
...
$preview_items[] =  json_encode($preview_product, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_FORCE_OBJECT);
...
file_put_contents(sprintf(IMPORT_FILE, $id), '['.join(',', $imported_items).']');
file_put_contents(sprintf(PREVIEW_FILE, $id), '['.join(',', $preview_items).']');
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
$product["$i"] = $line[$i]; и $preview_product["$i"] = $line[$i]; ???
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы