开发者

foreach for groups and subgroups in php

开发者 https://www.devze.com 2023-03-24 04:04 出处:网络
i have table in database: Group: id | Category | title| 1| 1| group1 | 2| 2| group2 | 3| 1| group3 |

i have table in database:

Group:
    | id | Category | title  | 
    | 1  | 1        | group1 | 
    | 2  | 2        | group2 | 
    | 3  | 1        | group3 |
    | 4  | 3        | group4 | 
    | 5  | 2        | group5 | 
    | 6  | 1        | group6 | 

News:
    | id | Group    | title  | body  |
    | 1  | 3        | title1 | body1 |
    | 2  | 2        | title2 | body2 |
    | 3  | 1        | title3 | body3 |
    | 4  | 4        | title4 | body4 |
    | 5  | 1        | title5 | body5 |
    | 6  | 5        | title6 | body6 |
    | 7  | 3        | title7 | body7 |
    | 8  | 2        | title8 | body8 |
    | 9  | 1        | title9 |开发者_运维技巧 body9 |
    | 10 | 6        | title10| body10 |
    | 11 | 1        | title11| body11 |
    | 12 | 5        | title12| body12 |

how can i show this as:

-GROUP1, GROUP3 and GROUP6
//GROUP1 (category1)
--title3
--title5
--title9
//GROUP3 (category1)
--title1
--title7
//GROUP6 (category1)
--title10
-GROUP2 and GROUP5 
//GROUP2 (category2)
--title2
--title8
//GROUP5 (category2)
--title6
--titl12
-GROUP4 
//GROUP4 (category3)
--title4

i will make this in foreach. thanks for help!


Your exact requested output makes this complicated.

$sql = 'SELECT n.title, n.Group AS group_id, g.Category AS cat_id
        FROM News AS n
        JOIN Group AS g ON g.id = group_id
        ORDER BY cat_id, group_id, n.id';

$result = mysql_query($query);

$categories = array();

while ($row = mysql_fetch_assoc($result)) {
    $catID = $row['cat_id'];
    $groupID = $row['group_id'];
    $title = $row['title'];

    $categories[$catID]['groups'][$groupID]['titles'][] = $title;
}

foreach ($categories as $catID => $groups) {

    $catGroups = '-GROUP'.implode(', GROUP',array_keys($groups)).PHP_EOL;
    $lastComma = strrpos($catGroups,',');
    if ($lastComma !== false) {
        $catGroups = substr($catGroups,0,$lastComma-1).
                     ' AND ' .substr($catGroups,$lastComma+1);
    }
    echo $catGroups;

    foreach ($groups as $groupID => $titles) {
        echo "//GROUP$groupID (category$catID)".PHP_EOL;
        foreach ($groups as $group => $titles) {
            echo '--'.$title.PHP_EOL;
        }
    }
}

If you didn't need such fancy output, this would be much simpler.

$sql = 'SELECT n.title, n.Group AS group_id, g.Category AS cat_id
        FROM News AS n
        JOIN Group AS g ON g.id = group_id
        ORDER BY cat_id, group_id, n.id';

$result = mysql_query($query);

$lastCatID = null;
$lastGroupID = null;

while ($row = mysql_fetch_assoc($result)) {
    $catID = $row['cat_id'];
    $groupID = $row['group_id'];
    $title = $row['title'];

    if ($catID !== $lastCatID){
        echo "*** CATEGORY $catID\n";
        $lastCatID = $catID;
    }
    if ($groupID !== $lastGroupID){
        echo "GROUP $groupID\n";
        $lastGroupID = $groupID;
    }
    echo "-- $title\n";
}


You told, you have your values in the database. So you have to get them first, e.g. with the following database query:

SELECT
    g.`title` AS `group_title`
    , n.`title` AS `news_title`
FROM
    `Group` AS g
INNER JOIN
    `News` AS n
ON
    g.`id` = n.`Group`
ORDER BY
    g.`Category`
    , n.`Group`
    , n.`title`

Store the data in an array. Now you can use a foreach loop to iterate over the array.

=== Here my update:

First fill the array while reading from the database (example query see above).

<?php
$data = array();
$res = mysql_query('SELECT ...'); 
while (($row = mysql_fetch_assoc($res)) !== false) {
    $data[$row['group_title']][] = $row['news_title'];
}
?>

Then write the array to the screen:

<?php
foreach ($data as $group_title => $groups) {
    echo $group_title . "\n";
    foreach ($groups as $news) { 
        echo "\t" . $news . "\n";
    }
}
?>
0

精彩评论

暂无评论...
验证码 换一张
取 消