我想使用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);
答案 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
会占用整个树。