Php JSON数据不应具有数字形式的键值,并且结果与预期结果不符
我正在使用递归创建带有嵌套集模型的JSON。我的结果并不像预期的那样,因为这个JSON帮助我生成了一个树。括号不是必需的JSON 我正在尝试创建这样的json。我对节点结构感兴趣:{} 问题:Php JSON数据不应具有数字形式的键值,并且结果与预期结果不符,php,json,Php,Json,我正在使用递归创建带有嵌套集模型的JSON。我的结果并不像预期的那样,因为这个JSON帮助我生成了一个树。括号不是必需的JSON 我正在尝试创建这样的json。我对节点结构感兴趣:{} 问题: 每个孩子都有{}但需要[] 不需要数字键 json键不应该像“text”、“children”、“name”这样带引号,它应该不带引号 联机编译器: 所需输出: { 正文:{ 名称:“根” }, 儿童:[{ 正文:{ 姓名:“纳雷什” }, 儿童:[{ 正文:{ 姓名:“rahul1” }, 儿童:[ [
{
正文:{
名称:“根”
},
儿童:[{
正文:{
姓名:“纳雷什”
},
儿童:[{
正文:{
姓名:“rahul1”
},
儿童:[
[]
],
正文:{
名称:“rahul123”
},
儿童:[
[]
],
正文:{
名称:“kapil1”
},
儿童:[{
正文:{
姓名:“priya12”
},
儿童:[{
正文:{
姓名:“amit12”
},
儿童:[
[]
]
}]
}]
}],
正文:{
姓名:“罗山”
},
儿童:[
[]
]
}]
}
这是我的MySql记录,我在这里获取这些记录是为了在开始时在$categoryjson中向您展示
如果您希望获取,而不是问题中的(无效,因为每个对象包含多个相等的键),则可以将代码更改为:
function tree($data, $left = 0, $right = null) {
$tree = array();
foreach ($data as $key => $value) {
if ($value['lft'] == $left + 1 && (is_null($right) || $value['rht'] < $right)) {
$child = []; // Let's make a new child
$child['text'] = ['name' => $value['name']]; // The text is required
$childTree = tree($data, $value['lft'], $value['rht']); // Let's find its children
if (!empty($childTree)) { // If it has children
$child['children'] = $childTree; // Let's save the children
}
$tree[] = $child; // Put the child in the tree
$left = $value['rht'];
}
}
return $tree;
}
$tree = tree(json_decode($category, true))[0]; // Since there's only one root, you want the first element of the tree
这将是完整的代码:如果您希望获得,而不是问题中的(无效,因为每个对象包含多个相等的键),则可以将代码更改为:
function tree($data, $left = 0, $right = null) {
$tree = array();
foreach ($data as $key => $value) {
if ($value['lft'] == $left + 1 && (is_null($right) || $value['rht'] < $right)) {
$child = []; // Let's make a new child
$child['text'] = ['name' => $value['name']]; // The text is required
$childTree = tree($data, $value['lft'], $value['rht']); // Let's find its children
if (!empty($childTree)) { // If it has children
$child['children'] = $childTree; // Let's save the children
}
$tree[] = $child; // Put the child in the tree
$left = $value['rht'];
}
}
return $tree;
}
$tree = tree(json_decode($category, true))[0]; // Since there's only one root, you want the first element of the tree
这将是完整的代码:您的实际输出和要求的输出似乎相同。您粘贴了错误的内容吗?@ADyson抱歉-这是我在编辑中的错误。不是OPs错误。@Johan您试图创建的数据结构无效,因为您在objectsyour“required”中重复了相同的密钥名“输出仍然无效,因此我们无法帮助您实现这一点。例如,在同一对象中不能有多个名为“文本”的属性。子对象需要是多个对象的数组,而不是包含单个对象(然后包含多个重复属性)的数组。好吧,这与您在问题中发布的所需结构不同,是吗?在这种情况下,请用你真正想要的更新问题。如果你看不出有什么不同,请仔细看看你链接的例子。你的实际输出和要求的输出似乎是一样的。你贴错东西了吗?@ADyson抱歉-那是我编辑的错误。不是OPs错误。@Johan您试图创建的数据结构无效,因为您在Objects中重复了相同的键名。您的“必需”输出仍然无效,因此我们无法帮助您实现这一点。例如,在同一对象中不能有多个名为“文本”的属性。子对象需要是多个对象的数组,而不是包含单个对象(然后包含多个重复属性)的数组。好吧,这与您在问题中发布的所需结构不同,是吗?在这种情况下,请用你真正想要的更新问题。如果你看不出它们之间的区别,那就仔细看看你链接到的例子吧。真正地为什么?最严格的JSON标准实际上要求他们这样做。浏览器通常更为宽松,但也不一定要如此。试图通过或不通过引号来解析某个东西……嗯,@Johan就是这么说的。我反对,但也许代码的使用将是生成尽可能干净的Javascript。也许这就是为什么这个问题曾经有Javasript标记。也许JSON会浪费字符基于上面的其他注释不幸的是,OP似乎不理解(而且似乎不想理解)什么是有效的JSON,所以可能与此有关,但我不能肯定。Javascript并不真正关心是否使用引号,因此很难理解为什么它很重要——通常没有人会看到这样的数据。最好生成符合标准的内容,json_encode()会自动完成这项工作。这只是我的观点,但删除引号似乎是浪费时间和CPU。我同意你的观点,似乎是浪费资源,但我们也不知道@Johan想要最终的代码做什么。如果JSON不是真的需要,那么引用就无关紧要了,因为它们会浪费空间。因此,在Johan的案例中,也许用处理来换取空间是有用的“钥匙周围不应该有引号”。真正地为什么?最严格的JSON标准实际上要求他们这样做。浏览器通常更为宽松,但也不一定要如此。试图通过或不通过引号来解析某个东西……嗯,@Johan就是这么说的。我反对,但也许代码的使用将是生成尽可能干净的Javascript。也许这就是为什么这个问题曾经有Javasript标记。也许JSON会浪费字符基于上面的其他注释不幸的是,OP似乎不理解(而且似乎不想理解)什么是有效的JSON,所以可能与此有关,但我不能肯定。Javascript并不真正关心是否使用引号,因此很难理解为什么它很重要——通常没有人会看到这样的数据。最好生成符合标准的内容,json_encode()会自动完成这项工作。这只是我的观点,但删除引号似乎是浪费时间和CPU。
echo preg_replace('/"(\w+)":/','$1:',json_encode($tree));