Я разбираю ответ 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» - это ответ от eBay. Это XML-код, который анализируется. У вас будет имя аспекта и значение аспекта ... это то, с чем я работаю.
да, но нам нужно понять его состав, чтобы сделать перевод. Мне не нужен необработанный XML, только структура объекта PHP. Пример вывода var_dump подойдет.
Я думаю, вы можете наверное делать $arrayValue["aspectValue"][] = $valueAspect;, но, не видя реальной структуры, я не могу быть уверен на 100%. (Вероятно, вам понадобится $arrayValue["aspectValue"] = array() непосредственно перед этим внутренним циклом.
@ADyson добавил структуру






$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;
Забыл преобразовать объекты имен XML в строки. Вероятно, это должно исправить!
зачем создавать одну структуру, а затем переводить ее во вторую структуру? Все это можно сделать за один шаг (см. Другие ответы)
Согласен, все это можно сделать за один шаг, но этот пример был предназначен для того, чтобы показать, как можно переписывать массивы для получения разных выходных данных с помощью ключей. Может, надо было это объяснить!
Чтобы кодировать его (и предполагая, что 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);
вы забыли показать нам, как выглядит
$resp, чтобы мы поняли, как нам, возможно, придется им управлять.