Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php JSON数据不应具有数字形式的键值,并且结果与预期结果不符_Php_Json - Fatal编程技术网

Php JSON数据不应具有数字形式的键值,并且结果与预期结果不符

Php JSON数据不应具有数字形式的键值,并且结果与预期结果不符,php,json,Php,Json,我正在使用递归创建带有嵌套集模型的JSON。我的结果并不像预期的那样,因为这个JSON帮助我生成了一个树。括号不是必需的JSON 我正在尝试创建这样的json。我对节点结构感兴趣:{} 问题: 每个孩子都有{}但需要[] 不需要数字键 json键不应该像“text”、“children”、“name”这样带引号,它应该不带引号 联机编译器: 所需输出: { 正文:{ 名称:“根” }, 儿童:[{ 正文:{ 姓名:“纳雷什” }, 儿童:[{ 正文:{ 姓名:“rahul1” }, 儿童:[ [

我正在使用递归创建带有嵌套集模型的JSON。我的结果并不像预期的那样,因为这个JSON帮助我生成了一个树。括号不是必需的JSON

我正在尝试创建这样的json。我对节点结构感兴趣:{}

问题:

  • 每个孩子都有{}但需要[]

  • 不需要数字键

  • json键不应该像“text”、“children”、“name”这样带引号,它应该不带引号

  • 联机编译器:

    所需输出:

    {
    正文:{
    名称:“根”
    },
    儿童:[{
    正文:{
    姓名:“纳雷什”
    },
    儿童:[{
    正文:{
    姓名:“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));