zoukankan      html  css  js  c++  java
  • 递归格式化JSON数据

    要求:

    有一个key=>value格式的数据,现在需要格式化将其输出,以key=value的形式输出,两个key=value直接用分号;隔开,如果value是数组的话,输出格式是这样的:key.item=value

    例子:

    {
        "person":{
            "name":"pig",
            "age":"18",
            "sex":"man",
            "hometown":{
                "province":"江西省",
                "city":"抚州市",
                "county":"崇仁县"
            }
        }
    }

    输出:

    person.name=pig;person.age=18;person.sex=man;person.hometown.province=江西省;person.hometown.city=抚州市;person.hometown.county=崇仁县

    分析:

    由于是不确定层级的数据,所以普通的两个或者多个for循环遍历肯定是行不通的,这里考虑使用递归的方式进行处理

    核心代码:

    <?php
    class Demo {
        public function printArray(array $data)
        {
            $result = $this->formatArray($data);
            echo substr($result, 0, -1);
        }
    
        public function formatArray($data, $prefix='')
        {
            if (is_array($data))
            {
                $result = '';
                foreach ($data as $key => $value)
                {
                    $result .= $this->formatArray($value, empty($prefix)? "$key" : "$prefix.$key");
                }
                return $result;
            }
            else
            {
                return "$prefix=$data;";
            }
        }
    }

    下面用三个层级的数据测试一下:

    <?php
    $tmp = [
        'date' => '2020-01-01',
        'name' => 'name',
        'type' => 'type',
        'array1' => [
            'a' => '1',
            'b' => '2',
            'c' => '3',
        ],
        'price' => '1.0',
        'sum' => '2.0',
        'array2' => [
            'A' => '1',
            'B' => '2',
            'C' => [
                'C1' => '1',
                'C2' => '2',
                'C3' => [
                    'C3_1' => '1',
                    'C3_2' => '2',
                    'C3_3' => '3',
                ],
            ],
        ],
        'count' => '12.0',
    ];
    
    $demo = new Demo(); $demo->printArray($tmp);

    输出:

    date=2020-01-01;name=name;type=type;array1.a=1;array1.b=2;array1.c=3;price=1.0;sum=2.0;array2.A=1;array2.B=2;array2.C.C1=1;array2.C.C2=2;array2.C.C3.C3_1=1;array2.C.C3.C3_2=2;array2.C.C3.C3_3=3;count=12.0

    总结:

    1、由于不确定数据的层级,普通的循环遍历肯定是行不通的,即使知道了数据最多只有3个层次,也最好别写for循环处理,毕竟每一层的for循环你都要判断,代码会非常臃肿而且难维护

    2、虽然递归很容易理解,但是也存在一些效率上的问题,这个需要谨慎使用,根据实际的生产环境数据多次测试,再选择合适的处理方法

  • 相关阅读:
    “做”的“累”
    举国默哀三天
    AjaxRequest
    客户端表单验证js
    书籍下载链接
    Html元素动态添加方法
    java文件读写操作
    查看oracle当前session
    转一篇有关Java的内存泄露的文章(受益哦)
    《高效能人士的七个习惯》摘录
  • 原文地址:https://www.cnblogs.com/lyc94620/p/12862663.html
Copyright © 2011-2022 走看看