PHP JSON:从同级参考中获取价值

时间:2019-02-11 04:09:56

标签: php json

我正在从事一个项目,该项目需要从可怕的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。但是该方法的问题在于,它不适用于嵌套项目。那么,有没有人有一种方法可以处理我在此获得的数据结构呢?

响应是一团糟,我不知道如何处理它,也不知道如何正确地对其进行搜索。因此,任何帮助将不胜感激。

1 个答案:

答案 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

但是,如果您具有相同名称的属性,则只会以这种方式看到最新的属性。