我正在从事一个项目,该项目需要从可怕的API中读取数据,该API会以可怕的结构化JSON数据作为响应:
"finn-contanct": {...}
"finn-adata": {
"@attributes": {
"model": "https://cache.api.finn.no/iad/ad/model/car-used-sale"
},
"finn-field": [
{
"@attributes": {
"name": "authorized_dealership",
"value": "true"
}
},
{
"@attributes": {
"name": "body_type",
"value": "Stasjonsvogn"
}
},
{
"@attributes": {
"name": "car_location",
"value": "Norge"
}
},
{
"@attributes": {
"name": "engine"
},
"finn-field": [
{
"@attributes": {
"name": "effect",
"value": "90"
}
},
{
"@attributes": {
"name": "fuel",
"value": "Diesel"
}
}
]
},
{...},
]
}
如何基于同级名称值动态获取每个属性下的值?理想情况下,该函数接受一个参数,该参数通过提供与我要查找的值相对应的键在其中找到值。
以下是我期望的示例:
给定一个需要一个参数的函数:getAttrValue('key')
,我想在@attributes同级下获取该值。因此,如果我使用这样的功能:getAttrValue('body_type')
,我只是期望返回:Stasjonsvogn
。我不太在乎嵌套项目。因此,如果我这样做:getAttrValue('fuel')
我只是在期待:Diesel
我在此处找到this answer。但是该方法的问题在于,它不适用于嵌套项目。那么,有没有人有一种方法可以处理我在此获得的数据结构呢?
响应是一团糟,我不知道如何处理它,也不知道如何正确地对其进行搜索。因此,任何帮助将不胜感激。
答案 0 :(得分:1)
以递归方式将属性收集到关联数组中:
function collectAttributes($data)
{
$attributes = [];
$nodeAttribute = isset($data['@attributes']) ? $data['@attributes'] : [];
//collect current node attribute value
if (isset($nodeAttribute['name'])) {
$attributes[$nodeAttribute['name']] = isset($nodeAttribute['value']) ? $nodeAttribute['value'] : '';
}
//collect nested attributes recursively
foreach ($data as $nestedNode) {
if (is_array($nestedNode)) {
$attributes = array_merge($attributes, collectAttributes($nestedNode));
}
}
return $attributes;
}
然后将结果用作简单的关联数组:
$data = json_decode($inputJson, true);
$atttributes = collectAttributes($data);
echo $attributes['fuel']; //don't forget isset checking if you are not sure about content
但是,如果您具有相同名称的属性,则只会以这种方式看到最新的属性。