Php Mysql嵌套类别子类别Json Response

时间:2016-06-25 05:37:44

标签: php mysql

我想使用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);

2 个答案:

答案 0 :(得分:1)

我得到的结果就像你上面提到的那样。陈克这个出来了。您必须将过程转换为面向对象的方法。     

$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);
?>

希望它能满足您的要求

答案 1 :(得分:0)

我知道这个答案已被接受,但我认为它会使代码变得很好。

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

我使用引用在一个循环中构建整个树,无论嵌套节点数和获取行的顺序(当已经获取父节点时会更容易,但是需要额外关注db中的更改) - 这种方式你可以用数据库查询alfaabetically订购类别。

由于它适用于任何嵌套级别,所有子项都存储在subcategories键下(与categorieslevelxxx相对),但每个子树可能以相同的方式处理。

...
$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及其所有后代,但您可以使用任何其他节点。当有更多的根类别(db中的$link[0]指向“虚拟”根)时,category_id = 0会占用整个树。