【问题标题】:How to parse a json and return a source tree如何解析 json 并返回源代码树
【发布时间】:2019-02-22 16:20:13
【问题描述】:

我有一个像这样的 JSON

$data = '{
    "account_owner": "",
    "account_type": "",
    "nest_uid":"17_15_1536914882_yhHDzQsDSI",
    "business_name": "",
    "sync_block": false,
    "validation": {"isError": false,
    "inputList": [],
    "message": ""},
    "contacts": [
        {
            "con_title": "",
            "con_fName": "",
            "con_lName": "",
            "con_job_title": "",
            "emails": [
                {
                    "email": "",
                    "type": "",
                    "primary": false,
                    "nest_uid": "17_15_1536914882_yhHDzQsDSK",
                    "validation": {
                        "isError": false,
                        "inputList": [],
                        "message": ""
                    },
                    "checked": false
                    }
            ],
            "phones": [
                {
                    "phone": "",
                    "type": "",
                    "primary": false,
                    "nest_uid": "17_15_1536914882_uHN38SxJ3s",
                    "validation": {
                        "isError": false,
                        "inputList": [],
                        "message": ""
                    },
                    "checked": false
                }
            ],
            "nest_uid": "17_15_1536914882_hwzB7dIn9v",
            "checked": false
        },
        {
        "con_title": "",
        "con_fName": "",
        "con_lName": "",
        "con_job_title": "",
        "emails": [
            {
                "email": "",
                "type": "",
                "primary": false,
                "nest_uid": "17_15_1536914882_yhHDzQsDSx",
                "validation": {
                    "isError": false,
                    "inputList": [],
                    "message": ""
                },
                "checked": false
            }
        ],
        "phones": [
            {
                "phone": "",
                "type": "",
                "primary": false,
                "nest_uid": "17_15_1536914882_uHN38SxJ3Y",
                "validation": {
                    "isError": false,
                    "inputList": [],
                    "message": ""
                },
                "checked": false
            }
        ],
        "nest_uid": "17_15_1536914882_hwzB7dIn9x",
        "checked": false
        }
    ]
}';

然后我有另一个输入

$param = ['contacts', 'emails'];

我必须编写一个递归函数,它将$param 作为路径并遍历数据集以给出类似这样的输出

例如,如果路径是

["contacts"]

输出

[
  {
    "data": {
      "con_title": "",
      "con_fName": "",
      "con_lName": "",
      "con_job_title": "",
      "emails": [
        {
          "email": "",
          "type": "",
          "primary": false,
          "nest_uid": "17_15_1536914882_yhHDzQsDSK",
          "validation": {
            "isError": false,
            "inputList": [],
            "message": ""
          },
          "checked": false
        }
      ],
      "phones": [
        {
          "phone": "",
          "type": "",
          "primary": false,
          "nest_uid": "17_15_1536914882_uHN38SxJ3s",
          "validation": {
            "isError": false,
            "inputList": [],
            "message": ""
          },
          "checked": false
        }
      ],
      "nest_uid": "17_15_1536914882_hwzB7dIn9v",
      "checked": false
    },
    "source": [
      "17_15_1536914882_yhHDzQsDSI",
      "17_15_1536914882_yhHDzQsDSK"
    ]
  },
  {
    "data": {
      "con_title": "",
      "con_fName": "",
      "con_lName": "",
      "con_job_title": "",
      "emails": [
        {
          "email": "",
          "type": "",
          "primary": false,
          "nest_uid": "17_15_1536914882_yhHDzQsDSK",
          "validation": {
            "isError": false,
            "inputList": [],
            "message": ""
          },
          "checked": false
        }
      ],
      "phones": [
        {
          "phone": "",
          "type": "",
          "primary": false,
          "nest_uid": "17_15_1536914882_uHN38SxJ3s",
          "validation": {
            "isError": false,
            "inputList": [],
            "message": ""
          },
          "checked": false
        }
      ],
      "nest_uid": "17_15_1536914882_hwzB7dIn9v",
      "checked": false
    },
    "source": [
      "17_15_1536914882_yhHDzQsDSI",
      "17_15_1536914882_yhHDzQsDSx"
    ]
  }
]

所以基本上与源树匹配的元素数量,即nest_ui的列表

我正在尝试按照这些思路编写代码

function genrate_nested_uid($innerdata,$param,$nestUidList,$parentkey){

    foreach($param as $keyParam)
    {
        foreach($innerdata as $key=>$property)
        {
           if($key=="nest_uid")
           {
                $parentkey[] = $property;
           }
           else if(is_array($property) && $key==$keyParam)
                {


                    array_shift($param);
                    if(count($param)>0)
                    {

                        foreach($property as $innerproperty){genrate_nested_uid($innerproperty,$param,$nestUidList,$parentkey);

                        }
                    }
                    else{
                        $nestUidList[] = [
                            "data"=>$property,
                            "list"=>$parentkey
                            ];
                    }

                }
        }

    }
        // echo 
    return $nestUidList;  

  }
$nestUidList=[];$parentkey=[];

$innerdataX = json_decode($data);
$paramX = ['contacts','emails'];
$res = genrate_nested_uid($innerdataX,$paramX,$nestUidList,$parentkey);

但我没有得到想要的结果

【问题讨论】:

  • @Sumithran 不错的编辑!
  • @LawrenceCherone 对评论感到抱歉,我已经更新了代码并稍微清理了一下
  • 那么@Sumithran 是您的帐户吗?因为它看起来像是在破坏你的帖子。
  • @LawrenceCherone nops 它的其他人

标签: php laravel-5


【解决方案1】:

这是我得到的(不确定是不是你想要的)

$data = '{"account_owner": "","account_type": "","nest_uid":"17_15_1536914882_yhHDzQsDSI","business_name": "","sync_block": false,"validation": {"isError": false,"inputList": [],"message": ""},
"contacts": [{"con_title": "","con_fName": "","con_lName": "","con_job_title": "","emails": [{"email": "","type": "","primary": false,"nest_uid": "17_15_1536914882_yhHDzQsDSK","validation": {"isError": false,
"inputList": [],"message": ""},"checked": false}],"phones": [{"phone": "","type": "","primary": false,
"nest_uid": "17_15_1536914882_uHN38SxJ3s","validation": {"isError": false,"inputList": [],"message": ""
},"checked": false}],"nest_uid": "17_15_1536914882_hwzB7dIn9v","checked": false},{"con_title": "","con_fName": "","con_lName": "","con_job_title": "","emails": [{"email": "","type": "","primary": false,"nest_uid": "17_15_1536914882_yhHDzQsDSx","validation": {"isError": false,
"inputList": [],"message": ""},"checked": false}],"phones": [{"phone": "","type": "","primary": false,
"nest_uid": "17_15_1536914882_uHN38SxJ3Y","validation": {"isError": false,"inputList": [],"message": ""
},"checked": false}],"nest_uid": "17_15_1536914882_hwzB7dIn9x","checked": false}]}';

$data = json_decode($data, true);

$d = [];
$param = ['contacts','emails','nest_uid'];

function walk($data, $param){
    $search = current($param);
    if(!$search) return $data;
    $out = [];
    foreach($data as $key=>$value){
        if(is_numeric($key)){
            $out[] = walk($value,$param);  
        }else if($key == $search && count($param)){
            array_shift($param);
            $out = walk($value, $param);
        }
    }
    return $out;
}

print_r(walk($data, $param));

输出['contacts','emails','nest_uid']

Array(
[0] => Array
    (
        [0] => 17_15_1536914882_yhHDzQsDSK
    )

[1] => Array
    (
        [0] => 17_15_1536914882_yhHDzQsDSx
    )

)

Sandbox

【讨论】:

  • 没有。那不是我想要的。好吧,Param 决定了路径。而且我需要将元素连同那里的父母一起返回。
  • 例如 .如果路径是直到 emails 。所以我们应该从数据集中得到两封电子邮件,uidlist 应该有 root-contact-email 的nestUId
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-15
  • 2014-02-05
  • 1970-01-01
相关资源
最近更新 更多