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

PHP - appending JSON to existing file inside new category

拜托,寻找解决我的问题的小方法。使用此脚本将数据附加到我现有的 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"
        }
    }
}
]

我知道这是函数内要做的事情,但我没有设置代码来做到这一点。感谢所有可以为其建议正确代码的人。

我不确定我是否完全理解您的要求(而且我正在根据我的 phone 进行编码),但我建议在写入文件之前生成完整的文件内容(仅一次)。

取消不必要的级别和前缀计数器...

$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 循环创建了 "current batch" 数据。如果它不为空,它将把它存储在 x 父键下的自己的组中。这样您就可以随时区分一批与另一批的数据。

不清楚 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));

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

此外,当您更新 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

开头