IT源码网

递归格式化JSON数据讲解

shasha 2021年05月16日 编程语言 122 0

要求:

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


发布评论

分享到:

IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

程序验证本福特定律讲解
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。