如何删除父数组JSON字符串并保留子数组JSON字符串?

时间:2017-09-17 01:24:46

标签: php arrays json

我有一个像这样的JSON数组(它在数组中有一个数组,如下面的代码所示)

{
    "data": [
        {
            "id": "40",
            "memo_kondisi": "OKe lah",
            "id_kondisi": "010118",
            "total_row": "2",
            "nilai_temuan": "10.000.000",
            "nilai_potensi_kerugian": "9.000.000",
            "data_sebab": [
                {
                    "id": "12",
                    "id_sebab": "0202",
                    "total_row_b": "2",
                    "memo_sebab": "sebab 1",
                    "data_rekomendasi": [
                       {
                        "id": "14",
                        "id_rekomendasi": "",
                        "nilai_rekomendasi": "0",
                        "memo_rekomendasi": "",
                        "data_tindak_lanjut": [
                            {
                                "id": "20",
                                "id_tindak_lanjut": "",
                                "nilai_tindak_lanjut": "0",
                                "memo_tindak_lanjut": "",
                                "tindak_lanjut_no": "1",
                                "tgl_tindak_lanjut": "0000-00-00"
                            },
                            {
                                "id": "21",
                                "id_tindak_lanjut": "",
                                "nilai_tindak_lanjut": "0",
                                "memo_tindak_lanjut": "",
                                "tindak_lanjut_no": "1",
                                "tgl_tindak_lanjut": "0000-00-00"
                            }
                           ]
                        },
                        {
                            "id": "14",
                            "id_rekomendasi": "",
                            "nilai_rekomendasi": "0",
                            "memo_rekomendasi": "",
                            "data_tindak_lanjut": [
                                {
                                    "id": "20",
                                    "id_tindak_lanjut": "",
                                    "nilai_tindak_lanjut": "0",
                                    "memo_tindak_lanjut": "",
                                    "tindak_lanjut_no": "1",
                                    "tgl_tindak_lanjut": "0000-00-00"
                                },
                                {
                                    "id": "21",
                                    "id_tindak_lanjut": "",
                                    "nilai_tindak_lanjut": "0",
                                    "memo_tindak_lanjut": "",
                                    "tindak_lanjut_no": "1",
                                    "tgl_tindak_lanjut": "0000-00-00"
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    ]
}

我希望JSON数组看起来像这样: 预期结果

{
    "data": [
        {
            "id": "40",
            "memo_kondisi": "OKe lah",
            "id_kondisi": "010118",
            "total_row": "2",
            "nilai_temuan": "10.000.000",
            "nilai_potensi_kerugian": "9.000.000",
            "data_sebab": [{
                                "id": "20",
                                "id_tindak_lanjut": "",
                                "nilai_tindak_lanjut": "0",
                                "memo_tindak_lanjut": "",
                                "tindak_lanjut_no": "1",
                                "tgl_tindak_lanjut": "0000-00-00"
                            },
                            {
                                "id": "21",
                                "id_tindak_lanjut": "",
                                "nilai_tindak_lanjut": "0",
                                "memo_tindak_lanjut": "",
                                "tindak_lanjut_no": "1",
                                "tgl_tindak_lanjut": "0000-00-00"
                            },
                                {
                                    "id": "20",
                                    "id_tindak_lanjut": "",
                                    "nilai_tindak_lanjut": "0",
                                    "memo_tindak_lanjut": "",
                                    "tindak_lanjut_no": "1",
                                    "tgl_tindak_lanjut": "0000-00-00"
                                },
                                {
                                    "id": "21",
                                    "id_tindak_lanjut": "",
                                    "nilai_tindak_lanjut": "0",
                                    "memo_tindak_lanjut": "",
                                    "tindak_lanjut_no": "1",
                                    "tgl_tindak_lanjut": "0000-00-00"
                                }
                            ]        
        }
    ]
}

因此,数组父项将被删除并将保留一个子数组,它就像push array但反过来它将删除父JSON数组。有什么建议吗?由于我不知道如何删除父数组,因此我没有提供任何最小代码

4 个答案:

答案 0 :(得分:1)

以下是使用jq的解决方案。如果样本数据在data.json,那么命令

$ jq -M '.data[].data_sebab |= map(.data_rekomendasi[].data_tindak_lanjut[])' data.json

产生

{
  "data": [
    {
      "id": "40",
      "memo_kondisi": "OKe lah",
      "id_kondisi": "010118",
      "total_row": "2",
      "nilai_temuan": "10.000.000",
      "nilai_potensi_kerugian": "9.000.000",
      "data_sebab": [
        {
          "id": "20",
          "id_tindak_lanjut": "",
          "nilai_tindak_lanjut": "0",
          "memo_tindak_lanjut": "",
          "tindak_lanjut_no": "1",
          "tgl_tindak_lanjut": "0000-00-00"
        },
        {
          "id": "21",
          "id_tindak_lanjut": "",
          "nilai_tindak_lanjut": "0",
          "memo_tindak_lanjut": "",
          "tindak_lanjut_no": "1",
          "tgl_tindak_lanjut": "0000-00-00"
        }
      ]
    }
  ]
}

答案 1 :(得分:1)

您可以使用json_decode()解码数组,然后重新分配数组:

# Presumably you have this somewhere as an array already or in a string
$json = '{
    "data": [
        {
            "id": "40",
            "memo_kondisi": "OKe lah",
            "id_kondisi": "010118",
            "total_row": "2",
            "nilai_temuan": "10.000.000",
            "nilai_potensi_kerugian": "9.000.000",
            "data_sebab": [
                {
                    "id": "12",
                    "id_sebab": "0202",
                    "total_row_b": "2",
                    "memo_sebab": "sebab 1",
                    "data_rekomendasi": [
                        {
                            "id": "14",
                            "id_rekomendasi": "",
                            "nilai_rekomendasi": "0",
                            "memo_rekomendasi": "",
                            "data_tindak_lanjut": [
                                {
                                    "id": "20",
                                    "id_tindak_lanjut": "",
                                    "nilai_tindak_lanjut": "0",
                                    "memo_tindak_lanjut": "",
                                    "tindak_lanjut_no": "1",
                                    "tgl_tindak_lanjut": "0000-00-00"
                                },
                                {
                                    "id": "21",
                                    "id_tindak_lanjut": "",
                                    "nilai_tindak_lanjut": "0",
                                    "memo_tindak_lanjut": "",
                                    "tindak_lanjut_no": "1",
                                    "tgl_tindak_lanjut": "0000-00-00"
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    ]
}';
# Decode
$array = json_decode($json,true);
# Reassign
$array['data'][0]['data_sebab'] = $array['data'][0]['data_sebab'][0]['data_rekomendasi'][0]['data_tindak_lanjut'];
# Write back to json
echo json_encode($array);

答案 2 :(得分:1)

你有4个嵌套数组,所以为了展平中间的两个层,你必须执行4个嵌套循环。

演示:https://3v4l.org/XWpZB

$data = json_decode($json, true)['data'];

$result = [];

foreach ($data as $datum) {
    // copy top tier
    $copy = $datum;
    // clear children
    $copy['data_sebab'] = null;

    foreach ($datum['data_sebab'] as $sebab) {
        foreach ($sebab['data_rekomendasi'] as $rekomendasi) {
            foreach ($rekomendasi['data_tindak_lanjut'] as $tindak_lanjut) {
                // copy leaf child
                $copy['data_sebab'] []= $tindak_lanjut;
            }
        }
    }

    // nest last leaf under top tier
    $result['data'] []= $copy;
}

echo json_encode($result, JSON_PRETTY_PRINT);

答案 3 :(得分:1)

尝试使用ES6 for...of声明

for-of引入的ES6循环允许以简洁的方式迭代数组(或任何可迭代的),类似于我们如何使用for-in迭代对象的键

工作演示:



var jsonObj = {
    "data": [
        {
            "id": "40",
            "memo_kondisi": "OKe lah",
            "id_kondisi": "010118",
            "total_row": "2",
            "nilai_temuan": "10.000.000",
            "nilai_potensi_kerugian": "9.000.000",
            "data_sebab": [
                {
                    "id": "12",
                    "id_sebab": "0202",
                    "total_row_b": "2",
                    "memo_sebab": "sebab 1",
                    "data_rekomendasi": [
                       {
                        "id": "14",
                        "id_rekomendasi": "",
                        "nilai_rekomendasi": "0",
                        "memo_rekomendasi": "",
                        "data_tindak_lanjut": [
                            {
                                "id": "20",
                                "id_tindak_lanjut": "",
                                "nilai_tindak_lanjut": "0",
                                "memo_tindak_lanjut": "",
                                "tindak_lanjut_no": "1",
                                "tgl_tindak_lanjut": "0000-00-00"
                            },
                            {
                                "id": "21",
                                "id_tindak_lanjut": "",
                                "nilai_tindak_lanjut": "0",
                                "memo_tindak_lanjut": "",
                                "tindak_lanjut_no": "1",
                                "tgl_tindak_lanjut": "0000-00-00"
                            }
                           ]
                        },
                        {
                            "id": "14",
                            "id_rekomendasi": "",
                            "nilai_rekomendasi": "0",
                            "memo_rekomendasi": "",
                            "data_tindak_lanjut": [
                                {
                                    "id": "20",
                                    "id_tindak_lanjut": "",
                                    "nilai_tindak_lanjut": "0",
                                    "memo_tindak_lanjut": "",
                                    "tindak_lanjut_no": "1",
                                    "tgl_tindak_lanjut": "0000-00-00"
                                },
                                {
                                    "id": "21",
                                    "id_tindak_lanjut": "",
                                    "nilai_tindak_lanjut": "0",
                                    "memo_tindak_lanjut": "",
                                    "tindak_lanjut_no": "1",
                                    "tgl_tindak_lanjut": "0000-00-00"
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    ]
};

var newArr = [];

for (let i of jsonObj.data) {
  for (let j of i.data_sebab) {
    for (let k of j.data_rekomendasi) {
      for (let l of k.data_tindak_lanjut) {
        newArr.push(l);
      }
    }
  }
}

jsonObj.data[0].data_sebab = newArr;

console.log(jsonObj);