Создать ответ JSON из проанализированного XML PHP

Я разбираю ответ API eBay. Я хочу вернуть это средство очистки веб-сайтов и упростить синтаксический анализ с помощью JavaScript. Я успешно проанализировал XML ... но теперь преобразование его в JSON для повторной отправки клиенту доставляет мне некоторые головные боли.

ПРИМЕЧАНИЕ: $resp - это ответ от eBay. Это их полный XML-код, который успешно анализируется с помощью приведенного ниже кода.

Например ... $valueName может быть Grade. Затем я перехожу к следующему циклу foreach и получаю для него значения. Эти values могут быть 10, 9.5, 9так далее.

Вот мой код PHP.

$arrayName = array();
$arrayValue = array();

foreach($resp->aspectHistogramContainer->aspect as $name) {
    $nameAspect = $name['name'];
    //$arrayName["aspectName"] = $nameAspect;

    foreach($name->valueHistogram as $value) {
        $valueAspect = $value['valueName'];
        //$arrayValue["aspectValue"] = $valueAspect;    
    }

    //array_push($arrayName, $arrayValue);
}
echo json_encode($arrayName);

Итак, без попытки создания собственного JSON я получаю то, что мне нужно. Я повторяю результаты, и это было похоже на это ...

NAME

----- Value

----- Value

----- Value

NAME

----- Value

NAME

etc etc

Для ответа JSON ... Я ищу что-то вроде ...

[
  {
        "name": "NAME",
        "value": ["value", "value"]
    }, {
        "name": "name",
        "value": ["value", "value"]
    }
]

Мы будем благодарны за любую помощь и руководство.

Ответ eBay такой (есть НАМНОГО больше <aspect> и <valueHistogram>)

<getHistogramsResponse xmlns = "http://www.ebay.com/marketplace/search/v1/services">
<ack>Success</ack>
<version>1.13.0</version>
<timestamp>2018-11-07T15:32:20.380Z</timestamp>
<aspectHistogramContainer>
<domainDisplayName>Baseball Cards</domainDisplayName>
<aspect name = "Card Manufacturer">
<valueHistogram valueName = "Ace Authentic">
<count>19</count>
</valueHistogram>
<valueHistogram valueName = "American Caramel">
<count>2024</count>
</valueHistogram>
<valueHistogram valueName = "APBA">
<count>10554</count>
</valueHistogram>
<valueHistogram valueName = "Bazooka">
<count>8826</count>
</valueHistogram>
<valueHistogram valueName = "Be A Player">
<count>17</count>
</valueHistogram>
<valueHistogram valueName = "Bell Brand Dodgers">
<count>334</count>

вы забыли показать нам, как выглядит $resp, чтобы мы поняли, как нам, возможно, придется им управлять.

ADyson 07.11.2018 16:25

«$ resp» - это ответ от eBay. Это XML-код, который анализируется. У вас будет имя аспекта и значение аспекта ... это то, с чем я работаю.

letsCode 07.11.2018 16:28

да, но нам нужно понять его состав, чтобы сделать перевод. Мне не нужен необработанный XML, только структура объекта PHP. Пример вывода var_dump подойдет.

ADyson 07.11.2018 16:31

Я думаю, вы можете наверное делать $arrayValue["aspectValue"][] = $valueAspect;, но, не видя реальной структуры, я не могу быть уверен на 100%. (Вероятно, вам понадобится $arrayValue["aspectValue"] = array() непосредственно перед этим внутренним циклом.

ADyson 07.11.2018 16:33

@ADyson добавил структуру

letsCode 07.11.2018 16:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
5
68
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

$results = array();

// Parse the XML into a keyed array

foreach($resp->aspectHistogramContainer->aspect as $name) {
    $nameAspect = (string) $name['name'];
    $values = array();
    foreach($name->valueHistogram as $value) {
        $values[] = (string) $value['valueName'];
    }
    $results[$nameAspect] = $values;
}

// This keeps things simple - rewrite to the required JSON format

$outputForJSON = array();
foreach ($results as $name => $values) {
    $outputForJSON[] = array(
         "name" => $name,
         "values" => $values
    );
}

echo json_encode($outputForJSON);

Это дает мне недопустимый тип смещения в $ results [$ nameAspect] = $ values;

letsCode 07.11.2018 16:41

Забыл преобразовать объекты имен XML в строки. Вероятно, это должно исправить!

JonJ 07.11.2018 16:43

зачем создавать одну структуру, а затем переводить ее во вторую структуру? Все это можно сделать за один шаг (см. Другие ответы)

ADyson 07.11.2018 16:46

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

JonJ 07.11.2018 16:50
Ответ принят как подходящий

Чтобы кодировать его (и предполагая, что SimpleXML), тогда это просто случай создания каждого внутреннего массива данных $aspect и последующего добавления к нему значений. Я использую (string), чтобы гарантировать, что данные не хранятся как SimpleXMLElement, что может вызвать побочные эффекты ...

$arrayName = array();

foreach($resp->aspectHistogramContainer->aspect as $name) {
    $aspect = [ "name" => (string)$name['name']];

    foreach($name->valueHistogram as $value) {
        $aspect["value"][] = (string)$value['valueName'];
    }
    $arrayName[] = $aspect;
}
echo json_encode($arrayName);

с образцом XML это дает ...

[{"name":"Card Manufacturer","value":["Ace Authentic","American Caramel","APBA","Bazooka","Be A Player","Bell Brand Dodgers"]}]

Создайте единый массив $resultArray и сохраните в нем значения. Сохраняя текущую структуру кода с минимальными изменениями, вот обновленный фрагмент кода,

$resultArray = array();

$i = 0; // Maintain Array Index value
foreach($resp->aspectHistogramContainer->aspect as $name) {
    $resultArray[$i]["aspectName"] = (string)$name['name'];;

    foreach($name->valueHistogram as $value) {
        $resultArray[$i]["aspectValue"][] = (string)$value['valueName'];
    }
    $i++; // Increment array index to store next value
}
echo json_encode($resultArray);

Другие вопросы по теме