在PHP中的组和子组的foreach

时间:2011-07-30 10:50:04

标签: php foreach

我在数据库中有表:

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 |

我怎样才能表现出来:

-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

我将在foreach中做到这一点。谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

你说过,你在数据库中有你的价值观。所以你必须先把它们拿出来,例如使用以下数据库查询:

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`

将数据存储在数组中。现在,您可以使用foreach循环迭代数组。

=== 在这里我的更新:

首先在从数据库读取时填充数组(示例查询见上文)。

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

然后将数组写入屏幕:

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

答案 1 :(得分:1)

您确切要求的输出会使这变得复杂。

$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;
        }
    }
}

如果您不需要这样的花哨输出,这将更加简单。

$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";
}