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_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));
你不应该在循环中每次都读取和写入文件。要获得所需的结构,您需要访问嵌套的数组元素。
此外,当您更新 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
、
开头
拜托,寻找解决我的问题的小方法。使用此脚本将数据附加到我现有的 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_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));
你不应该在循环中每次都读取和写入文件。要获得所需的结构,您需要访问嵌套的数组元素。
此外,当您更新 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
、