2017-09-02 103 views
1

好吧,所以我有两个表类别和菜肴。每个类别都有一个ID。每道菜属于一个特定的类别。现在我想要的是将属于特定类别的所有菜肴分组在一起。因此,所有的汤都将在汤类[{卷心菜,价格,描述,...},{番茄,价格,描述,...}]中。鸡群中的所有鸡等等。我现在所做的是这样的:PHP,在一个数组中获取特定类型的所有项目

$query = "Select id from Category"; 
    $Id = $mysqli->query($query); 

while($row = $Id->fetch_assoc()) { 
    $idlist[] = $row["id"]; 
} 





foreach ($idlist as $id){ 

    $query = "SELECT * from Dishes where Dishes.cat_id = '$id'"; 
    $Listings = $mysqli->query($query); 

    while($row = $Listings->fetch_assoc()) { 
     $AllDishes[] = array(
      'id' => $row['id'], 
      'Name' => $row['Name'], 
      'Description' => $row['Description'], 
      'cat_id' => $row['cat_id'], 
      'Price' => $row['Price'], 
      'ImagePath' => $row ['ImagePath'] 
     ); 
    } 

} 

但是,这会导致所有的菜被分组在一起。如何根据分类区分餐具?这是正确的方式来构建JSON数据吗?

+0

什么是您用来保存类别名称的字段?请告诉 –

+0

您的问题出现在'$ AllDishes [] ='中,因为您不断为每个类别添加“$ AllDishes”变量。您必须为每次迭代“更改”存储变量。 – insider

回答

1

1.使用JOIN做,在单个查询(最佳解决方案): -

$query = "Select Dishes.*,Category.id as cat_id from Category LEFT JOIN Dishes on Dishes.cat_id = Category.id"; 
$Listings = $mysqli->query($query); 
$AllDishes = array(); 
while($row = $Listings->fetch_assoc()) { 
    $AllDishes[$row['cat_id']][] = array(
     'id' => $row['id'], 
     'Name' => $row['Name'], 
     'Description' => $row['Description'], 
     'cat_id' => $row['cat_id'], 
     'Price' => $row['Price'], 
     'ImagePath' => $row ['ImagePath'] 
    ); 
} 
print_r($AllDishes); 

如果你想在你的编码方式做那么: -

2.Distinguish他们基于类别的id: -

$query = "Select id from Category";//change column name 
$Id = $mysqli->query($query); 

while($row = $Id->fetch_assoc()) { 
    $idlist[] = $row['id']; 
} 

foreach ($idlist as $id){ 
    $query = "SELECT * from Dishes where Dishes.cat_id = '$id'"; 
    $Listings = $mysqli->query($query); 

    while($row = $Listings->fetch_assoc()) { 
     $AllDishes[$id][] = array(
      'id' => $row['id'], 
      'Name' => $row['Name'], 
      'Description' => $row['Description'], 
      'cat_id' => $row['cat_id'], 
      'Price' => $row['Price'], 
      'ImagePath' => $row ['ImagePath'] 
     ); 
    } 

} 

3.Distinguish他们基于类别的name: -

$query = "Select id,category_name from Category";//change column name 
$Id = $mysqli->query($query); 

while($row = $Id->fetch_assoc()) { 
    $idlist[] = $row; 
} 

foreach ($idlist as $id){ 
    $id = $id['id']; 
    $category_name = $id['category_name']; //change column-name 
    $query = "SELECT * from Dishes where Dishes.cat_id = '$id'"; 
    $Listings = $mysqli->query($query); 

    while($row = $Listings->fetch_assoc()) { 
     $AllDishes[$category_name][] = array(
      'id' => $row['id'], 
      'Name' => $row['Name'], 
      'Description' => $row['Description'], 
      'cat_id' => $row['cat_id'], 
      'Price' => $row['Price'], 
      'ImagePath' => $row ['ImagePath'] 
     ); 
    } 

} 

注: - 请更改列名在第三个解决方案中(因为我不知道你需要存储什么列名称类别名称)。

+0

敢问我使用第一个SQL语句的第三个选项:) –

+0

对不起 - 使用1条SQL语句加入。 –

+0

@NigelRen添加了.check一次 –

0

我不知道,但我认为这里将是你的while循环预期结果

$AllDishes = array(); 
while($row = $Listings->fetch_assoc()) { 
    $AllDishes[$row['Name']][] = array(
     'id' => $row['id'], 
     'Name' => $row['Name'], 
     'Description' => $row['Description'], 
     'cat_id' => $row['cat_id'], 
     'Price' => $row['Price'], 
     'ImagePath' => $row ['ImagePath'] 
    ); 
} 
0

您可以使用SQL连接代替两个单独的SQL查询

I hope the following may help you. 



    $query = "SELECT * FROM Dishes INNER JOIN Category 
            ON Dishes.id = Category.id ORDER BY Dishes.id"; 
    $res = $mysqli->query($query);  
    while($row = $res->fetch_assoc()) 
    { 
     $AllDishes[$$row['category_name']][] = array(
              'id' => $row['id'], 
              'Name' => $row['Name'], 
              'Description' => 
                $row['Description'], 
              'cat_id' => 
                $row['cat_id'], 
              'Price' => $row['Price'], 
              'ImagePath' => 
                $row['ImagePath'] 
              );//Array Close 
    } 
相关问题