PHP-将JSON附加到新类别中的现有文件

时间:2018-08-14 03:54:44

标签: php json multidimensional-array append file-put-contents

请,为我的问题寻找一点推动力。使用此脚本将数据追加到我现有的JSON中。我正在寻找的是:添加新数据时,将创建新的$ key(类别)并将其全部设置为JSON。最好在示例中显示。这是我的代码:

function parseTag($content1,$tg)
{
    $dom = new DOMDocument;
    libxml_use_internal_errors(true);
    $dom->loadHTML($content1);
    libxml_clear_errors();
    $attr = array();
    foreach ($dom->getElementsByTagName($tg) as $tag) {
        foreach ($tag->attributes as $attribName => $attribNodeVal)
        {
            $attr[$attribName]=$tag->getAttribute($attribName);
        }
    }
    return $attr;
}
for ($i = 0; $i < count($split); $i++) 
{
    $attrib_arr = parseTag($split[$i],'path');
    if (empty($attrib_arr)) {break;}
    $data_results = file_get_contents('newfile.json');
    $tempArray = json_decode($data_results, true);
    $a = "a".$i; 
    $tempArray[]=array($a => $attrib_arr);
    $jsonData = json_encode($tempArray, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
    file_put_contents('newfile.json', $jsonData); 
}

它输出此:

[
{
    "a0": {
        "d": "m34.511 143.4v3.0302l54.101-0.63086v-2.078z",
        "points": "34.510773,146.42924 88.611514,145.79838 88.611514,143.72037 34.510773,143.39908 ",
        "fill": "#353564"
    }
},
{
    "a1": {
        "d": "m34.511 146.43 78.119 2.1017 56.193-2.4552-80.211-0.27738z",
        "points": "112.6299,148.53093 168.82266,146.07576 88.611514,145.79838 34.510773,146.42924 ",
        "fill": "#afafde"
    }
},
{
    "a2": {
        "d": "m88.612 143.72 80.211-1.5957v3.9511l-80.211-0.27738z",
        "points": "168.82266,142.1247 168.82266,146.07576 88.611514,145.79838 88.611514,143.72037 ",
        "fill": "#e9e9ff"
    }
}
]

我正在寻找的是这个

[
{
"x": {
        "a0": {
            "d": "m34.511 143.4v3.0302l54.101-0.63086v-2.078z",
            "points": "34.510773,146.42924 88.611514,145.79838 88.611514,143.72037 34.510773,143.39908 ",
            "fill": "#353564"
        },

        "a1": {
            "d": "m34.511 146.43 78.119 2.1017 56.193-2.4552-80.211-0.27738z",
            "points": "112.6299,148.53093 168.82266,146.07576 88.611514,145.79838 34.510773,146.42924 ",
            "fill": "#afafde"
        },
        "a2": {
            "d": "m88.612 143.72 80.211-1.5957v3.9511l-80.211-0.27738z",
            "points": "168.82266,142.1247 168.82266,146.07576 88.611514,145.79838 88.611514,143.72037 ",
            "fill": "#e9e9ff"
        }
    }
}
]

我知道这是在函数内要做的事情,但是我无法设置代码来做到这一点。谢谢所有能提出正确代码的人。

3 个答案:

答案 0 :(得分:0)

我不确定我是否完全了解您的要求(并且正在使用手机进行编码),但是我建议在写入文件之前(仅一次)生成完整的文件内容。

删除不必要的级别和带前缀的计数器...

$tempArray = [];
foreach ($split as $item) {
    $attrib_arr = parseTag($item, 'path');
    if (!empty($attrib_arr)) {
        $tempArray[] = $attrib_arr;
    }
}
if (!empty($tempArray)) {
    $data_array = json_decode(file_get_contents('newfile.json'), true);
    $data_array["x"][] = $tempArray;
    $jsonData = json_encode($data_array, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
    file_put_contents('newfile.json', $jsonData);
}

在此代码段中,foreach循环创建数据的“当前批次”。如果不为空,它将在x父键下将其存储在自己的组中。这样一来,您就可以始终将一批数据与另一批数据区分开。

答案 1 :(得分:0)

目前尚不清楚x的含义,但我想这就是您要寻找的内容:

$json = json_decode(file_get_contents('newfile.json'), true);

foreach ($split as $i => $item)
    if ($item = parseTag($item, 'path'))
       $json['x']["a$i"] = $item;
    else
       break; // for some reason break loop if no result in that particular slice...

file_put_contents('newfile.json', json_encode($json, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));

注意JSON_UNESCAPED_UNICODEJSON_UNESCAPED_SLASHES可能意味着创建了无法解析的无效JSON。

编辑:保留,对于确切输出:

$json = json_decode(file_get_contents('newfile.json'), true);

foreach ($split as $i => $item)
    if ($item = parseTag($item, 'path'))
       $json[0]['x']["a$i"] = $item;
    else
       break; // for some reason break loop if no result in that particular slice...

file_put_contents('newfile.json', json_encode($json, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));

答案 2 :(得分:0)

您不应在每次循环中都读写文件。为了获得所需的结构,您需要访问嵌套的数组元素。

此外,在更新JSON时,需要从现有数组结束处开始aN键。您的代码每次都从a0开始,它将覆盖现有元素,而不是添加到现有元素中。

您不应该使用[]添加到数组中,而需要使用$a作为新数组元素的索引。

$data_results = file_get_contents('newfile.json');
$tempArray = json_decode($data_results, true);

if (empty($tempArray[0]['x'])) {
    $i = 0;
} else {
    end($tempArray[0]['x']);
    $lastkey = key($tempArray[0]['x']);
    $i = substr($lastkey, 1) + 1;
}

foreach ($split as $el) 
{
    $attrib_arr = parseTag($el, 'path');
    if (empty($attrib_arr)) {
        break;
    }
    $a = "a".$i;
    $i++;
    $tempArray[0]['x'][$a]=$attrib_arr;
}

$jsonData = json_encode($tempArray, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
file_put_contents('newfile.json', $jsonData); 

请注意,每次运行此命令时,添加到文件中的新元素都将以a0开头,