从多维数组中的第3级抓取所有值

时间:2017-06-07 13:52:31

标签: php arrays json parsing

在我正在编写的PHP脚本中,我需要提取一些大量的JSON文件并解析它们以检索每个顶级对象的单个值。

我的JSON文件如下所示:

[
    {
        "SOMEDATA": "SOMEVALUE",
        "MOREDATA": "MOREVALUES",
        "METADATA": {
            "CUSTOM": {
                "TYPE": "THE VALUE THAT I NEED",
                //...more irrelevant data
            },
            //...more irrelevant data
        },
        //...more irrelevant data
    },
    ... Repeats several thousand times. 
]

我现在唯一需要的数据是TYPE,它埋藏了几层。我想知道的是,如果有一种方法可以使用一些内置的PHP功能将所有这些TYPE提取到一个数组中。我一直在做的只是循环遍历JSON文件中的每个顶级索引,但我觉得可能有更好的方法来做到这一点。现在我在执行时超过一分钟进行基准测试,这有点痛苦,因为这是一个经常被访问的小型Web应用程序。

如果没有可用于实现以下结果的内置函数:

[
    0 => "TYPE1",
    1 => "TYPE2",
    2 => "TYPE3",
    3 => "TYPE4",
    ...
]

是否有一些内部指针或PHP对象的任何内容我可以使用它来执行此操作而不仅仅是循环遍历数组?

我通常只是经常将解析后的数组作为cron作业写入新文件,只是从已经解析过的文件中获取数据,这会快得多,但JSON文件变化太频繁而无法证明这种方法。

注意:我可以使用array_walk执行此操作并在回调中构建新数组,正如其他一些答案所示,但在内部仍然是循环。我想知道是否有办法在后端利用指针和数组内部优势来优化性能。除非使用不可能的解释语言,否则我不知道PHP能够动态优化代码。我对PHP比较陌生,所以我不确定它的功能是什么。

1 个答案:

答案 0 :(得分:1)

假设您正在使用JSON,通过json_decode($json)运行它,然后在输出中使用foreach,那么您可以做到最好。 Foreach is faster than for在处理数组时,它只是一个问题,即循环本身的优化程度以及您在此时运行它的硬件。

对于像这样的简单循环

foreach($json as $val){
    $output[] = $val['metadata']['custom']['type'];
}

与循环一样高效。