Есть ли лучший способ сгруппировать результаты запроса с помощью цикла в PHP? - PullRequest
2 голосов
/ 01 сентября 2010

это мой первый вопрос в stackoverflow .

У меня есть две таблицы MYSQL: категории и продукты. Я управляю результатами запроса с помощью цикла while в PHP, чтобы сгруппировать каждую категорию с ее продуктами. Это первый раз, когда я что-то делаю, и я думаю, что сделал это очень "хитро / жестко" (извините за мой английский) Я думаю, что это должен быть лучший способ сделать это. Итак, я хотел бы спросить профессиональных программистов. Вот мой код:

 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 ]

4 голосов
/ 01 сентября 2010

Всегда лучше не смешивать HTML с PHP.

Так как вам нужен мой совет (опытный PHP-кодер около 12 лет), я просто очень быстро кодирую его с нуля:

<?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>
3 голосов
/ 01 сентября 2010

Я бы предложил прочитать в Иерархические данные .Отличное чтение.Особенно следует обратить внимание на модель вложенного набора.

Требуется немного для изучения, а также для реализации, но оно того стоит для конечного результата!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...