Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.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 Mysql嵌套类别子类别Json响应_Php_Mysql - Fatal编程技术网

Php Mysql嵌套类别子类别Json响应

Php Mysql嵌套类别子类别Json响应,php,mysql,Php,Mysql,我想使用php mysql将类别和子类别显示为json响应。我有三个等级。我正在运行此查询,但结果不是预期的。请帮我解决这个问题 我需要json响应,如下所示 [{ "id": "1", "name": "Electronics", "categorieslevelone": [{ "id": "2", "name": "Mobiles", "categoriesleveltwo": [{ "id":

我想使用php mysql将类别和子类别显示为json响应。我有三个等级。我正在运行此查询,但结果不是预期的。请帮我解决这个问题

我需要json响应,如下所示

[{
    "id": "1",
    "name": "Electronics",
    "categorieslevelone": [{
        "id": "2",
        "name": "Mobiles",
        "categoriesleveltwo": [{
            "id": "3",
            "name": "Samsung",
            "parent_id": "2"
        }, {
            "id": "4",
            "name": "Nokia",
            "parent_id": "2"
        }]
    }]
我的代码:

header('Content-Type: application/json');
        $sql = "select * from category where category_id = 0";
        $q = $this->db->conn_id->prepare($sql);
        $q->execute();
        $json_response = array();
        while ($row = $q->fetch(PDO::FETCH_ASSOC)) {
            $row_array = array();
            $row_array['id'] = $row['id'];
            $row_array['name'] = $row['name'];
            $row_array['categorieslevelone'] = array();
            $id = $row['id'];
            $sqltwo = "select * from category where category_id = ? ";
            $r = $this->db->conn_id->prepare($sqltwo);
            $r->bindParam(1, $id);
            $r->execute();
            while ($data = $r->fetch(PDO::FETCH_ASSOC)) {
                $id2 = $data['id'];
                $row_array['categoriesleveltwo'] = array();
                $row_array['categorieslevelone'][] = array(
                    'id' => $data['id'],
                    'name' => $data['name'],
                );
                $sql3 = "select * from category where category_id = ? ";
                $s = $this->db->conn_id->prepare($sql3);
                $s->bindParam(1, $id2);
                $s->execute();
                while ($list = $s->fetch(PDO::FETCH_ASSOC)) {
                    $row_array['categoriesleveltwo'][] = array(
                        'id' => $list['id'],
                        'name' => $list['name'],
                    );
                }
            }
            array_push($json_response, $row_array); //push the values in the array
        }
        echo json_encode($json_response);

我得到的结果和你上面提到的一样。把这件事说出来。您必须将过程方法转换为面向对象方法。
$main_cat = array();
while($row = mysqli_fetch_assoc($query))
{
    $query2 = mysqli_query($con,'Select category_id as id,category_name as name from category where parent_id = '.$row['id'].'');
    $sub_cat = array();
    while($row1 = mysqli_fetch_assoc($query2))
    {
        $query3 = mysqli_query($con,'Select category_id as id,category_name as name from category where parent_id = '.$row1['id'].'');
        $sub_cat2 = array();
        while($row2 = mysqli_fetch_assoc($query3))
        {
            array_push($sub_cat2, $row2);   
        }
        $row1['categoriesleveltwo'] = $sub_cat2;
        array_push($sub_cat, $row1);    
    }

    $row['categorieslevelone'] = $sub_cat;
    array_push($main_cat, $row);
}

echo json_encode($main_cat);
?>

希望它能满足您的要求

我知道这个答案已经被接受,但我认为它会成为一个很好的代码kata

下面的代码将根据数据库中的邻接列表构建树结构。有更多的方法来维护树结构,但没有简单的方法-所有方法都涉及维护/代码效率的权衡

我使用引用在一个循环中构建整个树,而不考虑嵌套节点的数量和获取行的顺序(当父节点已经获取时会更容易,但需要特别注意数据库中的更改),这样您就可以使用db查询对类别进行任意排序

由于它适用于任何嵌套级别,所以所有子目录都存储在
子类别
键下(与
分类级别xxx
相反),但每个子树的处理方式可能相同

...
$link = [];
$data = [];
while ($row = $q->fetch(PDO::FETCH_ASSOC)) {
    $id     = $row['id'];
    $parent = $row['category_id'];
    unset($row['category_id']);

    empty($link[$id]) or $row += $link[$id];
    isset($link[$parent]['subcategories']) or $link[$parent]['subcategories'] = [];    

    $link[$parent]['subcategories'][] = $row;

    $last_idx  = count($link[$parent]['subcategories']) - 1;
    $link[$id] = & $link[$parent]['subcategories'][$last_idx];
}

$data = $link[1];
unset($link); //tree might be cached here.

$link[1]
结尾处表示我们需要类别1及其所有后代,但您可以选择任何其他节点
$link[0]
当数据库中有更多根目录(
category\u id=0
指向“virtual”root)时,将占用整个树。

错误输出是什么样子的?{“id”:“1”,“name”:“Electronics”,“categorieslevelone”:[{“id”:“2”,“name”:“Mobiles”},{“id”:“261”,“name”:“Networking”}],“categoriesleveltwo”:[{“id”:“259”,“name”:“Routers”}]}上面的响应我得到了您希望输出是什么样子的?您好,读一下,很简单。非常感谢仙女,工作很好。谢谢你的帮助,不寒而栗