Выровнять многомерный ассоциативный массив (декодированный из JSON)

У меня есть объект JSON, как это:

{
"chats": [
{
"type": "chat",
"visitor": {
"id": "S1506042519.608fc390eb",
"name": "Visitor"},
"agents": [
{
"display_name": "Agent",
"email": "[email protected]"}
],
"chat_start_url": "https://example.com/",
"group": [
3, 4
],
"messages": [
{
"author_name": "Agent",
"text": "Hello. How may I help you?",
"welcome_message": true
},
{
"author_name": "Visitor",
"text": "transfer me to agent"},
{
"author_name": "Agent",
"text": "Hello. How may I help you?"},
{
"author_name": "Visitor",
"text": "transfer me to agent"}
]
},
{
"type": "chat",
"visitor": {
"id": "S1506042519.608fc390eb",
"name": "Visitor"},
"agents": [
{
"display_name": "Agent",
"email": "[email protected]"}
],
"chat_start_url": "https://example.com/",
"group": [
3, 4
],
"messages": [
{
"author_name": "Agent",
"text": "Hello. How may I help you?",
"welcome_message": true
},
{
"author_name": "Visitor",
"text": "transfer me to agent"}
]
}
]
}

Я хочу записать этот объект в файл CSV, но с определенным форматированием. То, что я хочу получить в результате, показано на этом сайте: https://json-csv.com/
Просто скопируйте мой JSON, чтобы увидеть его, вот быстрый скриншот: http://take.ms/p2FAI

Вопрос Как правильно реорганизовать массив, чтобы получить этот вывод:

$refactoredArray = array(
0 => array(
"chats_type",
"chats_visitor_id",
"chats_visitor_name",
"chats_agents_display_name",
"chats_agents_name",
"chats_start_url",
"chats_group_1",
"chats_group_2",
"chats_messages_author_name",
"chats_messages_text",
"chats_messages_welcome_message"),
1 => array(
"chat",
"S1506042519.608fc390eb",
"Visitor",
"Agent",
"[email protected]",
"https://example.com/",
3,
4,
"Agent",
"Hello. How may I help you?",
true
),
2 => array(
"",
"",
"",
"",
"",
"",
"",
"",
"Visitor",
"transfer me to agent",
""),
3 => array(
"",
"",
"",
"",
"",
"",
"",
"",
"Agent",
"Hello. How may I help you?",
""),
4 => array(
"",
"",
"",
"",
"",
"",
"",
"",
"Visitor",
"transfer me to agent",
""),
5 => array(
"chat",
"S1506042519.608fc390eb",
"Visitor",
"Agent",
"[email protected]",
"https://example.com/",
3,
4,
"Agent",
"Hello. How may I help you?",
true
),
6 => array(
"",
"",
"",
"",
"",
"",
"",
"",
"Visitor",
"transfer me to agent",
"")
);

Есть идеи: с? Я совершенно не могу сгладить массив правильно, чтобы я мог положить его в файл CSV.

1

Решение

Я надеюсь, что вы уже решили эту проблему, если не я прилагаю некоторый код, чтобы дать вам представление о том, что я сделал, сначала декодируйте полученный вывод json, затем читаете этот вывод и углубляетесь настолько глубоко, насколько это необходимо, используя ассоциативный массив, чтобы сгладить ваш ответ, код не завершен, но он работает и поможет вам начать, надеюсь, вам повезет!

$jsonvalue = json_decode('{
"chats": [{
"type": "chat",
"visitor": {
"id": "S1506042519.608fc390eb",
"name": "Visitor"},
"agents": [
{
"display_name": "Agent",
"email": "[email protected]"}
],
"chat_start_url": "https://example.com/",
"group": [
3, 4
],
"messages": [
{
"author_name": "Agent",
"text": "Hello. How may I help you?",
"welcome_message": true
},
{
"author_name": "Visitor",
"text": "transfer me to agent"},
{
"author_name": "Agent",
"text": "Hello. How may I help you?"},
{
"author_name": "Visitor",
"text": "transfer me to agent"}
]
}, {
"type": "chat",
"visitor": {
"id": "S1506042519.608fc390eb",
"name": "Visitor"},
"agents": [
{
"display_name": "Agent",
"email": "[email protected]"}
],
"chat_start_url": "https://example.com/",
"group": [
3, 4
],
"messages": [
{
"author_name": "Agent",
"text": "Hello. How may I help you?",
"welcome_message": true
},
{
"author_name": "Visitor",
"text": "transfer me to agent"}
]
}]
}');
$flatArray = [];
$chatID = 0;
foreach ($jsonvalue as $chats) {
foreach ($chats as $chatProperty) {
$flatArray[$chatID] = $chatID;
$flatArray['chatType'] = $chatProperty->type;
//visitor
$flatArray['visitorID'] = $chatProperty->visitor->id;
$flatArray['visitorName'] = $chatProperty->visitor->name;

foreach ($chatProperty->group as $groupValue) {
$flatArray['group_' . $groupValue] = $groupValue;
echo $groupValue;
}

foreach ($chatProperty->messages as $value) {
$flatArray['author_name'] = $value->author_name;
$flatArray['text'] = $value->text;
$flatArray['welcome_message'] = isset($value->welcome_message) ?
$value->welcome_message : 'no welcome message';
}
$chatID++;
}
}

var_dump($flatArray);
0

Другие решения

Я сделал это, вот функция, которая разбирает именно так, как https://json-csv.com/ Является ли.

function json2array($array) {

$flat = array();
foreach ($array as $key => $value) {
if(is_array($value)) {
$chatID = 0;
foreach ($value as $chatsKey => $chatsValue) {
foreach ($chatsValue as $singleChatKey => $singleChatValue) {
if(is_array($singleChatValue)) {
$chatPropID = 0;
foreach ($singleChatValue as $chatPropKey => $chatPropValue) {
$maxPropID = 0;
if ($chatPropKey > $maxPropID)
$maxPropID = $chatPropKey;
if(is_array($chatPropValue)) {
foreach ($chatPropValue as $lastPropKey => $lastPropValue) {
$flat[ $chatID+$chatPropKey ][ $key . '_' . $singleChatKey . '_' . $lastPropKey ] = $lastPropValue;
}
} else {
$flat[ $chatID ][ $key . '_' . $singleChatKey . '_' . $chatPropKey ] = $chatPropValue;
}

$chatPropID++;
}
} else {
$flat[ $chatID ][ $key . '_' . $singleChatKey ] = $singleChatValue;
}
}
$chatID += $maxPropID + 2;
}
} else
$flat[0][$key] = $value;
}

return $flat;
}

Спасибо ребята за помощь <3

0

По вопросам рекламы [email protected]