请,为我的问题寻找一点推动力。使用此脚本将数据追加到我现有的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"
}
}
}
]
我知道这是在函数内要做的事情,但是我无法设置代码来做到这一点。谢谢所有能提出正确代码的人。
答案 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_UNICODE
和JSON_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
开头,