有没有更好的方法在PHP中使用循环对查询结果进行分组?

时间:2010-09-01 18:15:08

标签: php mysql while-loop

这是我在 stackoverflow 中的第一个问题。

我有两个MYSQL表:类别和产品。我使用PHP中的while循环管理查询结果,以便用其产品对每个类别进行分组。这是我第一次这样做,而且我认为我非常“狡猾/硬编码”(对不起我的英文)。我认为这应该是一个更好的方法来做到这一点。所以,我想向专业程序员询问。这是我的代码:

 CREATE TABLE IF NOT EXISTS `categories` (
 `id` int(11) NOT NULL auto_increment,
 `name` text NOT NULL,
 PRIMARY KEY  (`id`)
 ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=8 ;


 CREATE TABLE IF NOT EXISTS `products` (
 `id` int(11) NOT NULL auto_increment,
 `name` text NOT NULL,
 `description` text NOT NULL,
 `category` int(11) NOT NULL,
 `photo` int(11) NOT NULL,
  PRIMARY KEY  (`id`)
 ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=33 ;

我有一个查询返回与其类别相关的产品:

SELECT categories.name as category,products.name as product
FROM categories
INNER JOIN products ON(categories.id = products.category)

使用PHP,我管理结果,为每个类别及其产品创建一个无序列表:

<?php
$category = '';//A control variable

while($row = mysql_fetch_array($query))
{
    //if its a new category I start a new <ul>
    if($row['category'] != $category)
    {
        //If it´s not the firt category I need to close previous one
        if($category != '')
        {
            echo "</ul>\n";
        }
        //I start the new <ul>
        echo '<h2>' . $row['category'] . '</h2>';
        echo '<ul>';
    }

    //I create the correspondient <li>
    echo '<li>' . $row['product'] . "</li>\n";

    //Asign the value of actual category for the next time in the loop
    $category = $row['category'];

}

//I neeed to close last <ul>
echo "</ul>\n";
?>

有没有更好的方法来执行此操作? 提前感谢您的回答!

2 个答案:

答案 0 :(得分:4)

最好不要将HTML与PHP混合。

既然你需要我的建议(经过大约12年的资深PHP编码器),我只是快速地从头开始编码:

<?php
$pdo = new PDO($dsn, $user, $pass);

$sql = "SELECT categories.name as category,products.name as product
FROM categories
INNER JOIN products ON(categories.id = products.category)";

$stmt = $pdo->prepare($sql);
$stmt->execute();

$categories = array();
while (($row = $stmt->fetch(PDO::FETCH_ASSOC)))
{
    $category = $row['category'];
    $categories[$category][] = $row['product'];
}

// In your view:
?>
<html>
    <body>
<?php
    foreach ($categories as $category => $products)
    {
?>
        <h2><?php echo $category; ?></h2>
        <ul class="products">
<?php
        foreach ($products as $product)
        {
?>
            <li><?php echo $product; ?></li>
<?php
        }
?>
        </ul>
<?php
    }
?>
    </body>
</html>

答案 1 :(得分:3)

我建议阅读Hierarchical Data。很棒的阅读。您应该特别注意嵌套集模型。

它需要花点时间学习并且需要一些实现,但最终结果非常值得!