Php Mysql嵌套类别子类别Json响应
我想使用php mysql将类别和子类别显示为json响应。我有三个等级。我正在运行此查询,但结果不是预期的。请帮我解决这个问题 我需要json响应,如下所示Php Mysql嵌套类别子类别Json响应,php,mysql,Php,Mysql,我想使用php mysql将类别和子类别显示为json响应。我有三个等级。我正在运行此查询,但结果不是预期的。请帮我解决这个问题 我需要json响应,如下所示 [{ "id": "1", "name": "Electronics", "categorieslevelone": [{ "id": "2", "name": "Mobiles", "categoriesleveltwo": [{ "id":
[{
"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”}]}上面的响应我得到了您希望输出是什么样子的?您好,读一下,很简单。非常感谢仙女,工作很好。谢谢你的帮助,不寒而栗