接近摘要w/详细报告PHP/MySQL比较数组

接近摘要w/详细报告PHP/MySQL比较数组,php,mysql,arrays,Php,Mysql,Arrays,如果我的问题措辞不正确,请原谅,这是我的第一篇帖子。 另外,我要说的是,我正在使用过程化PHP,我确实知道OO PHP的优点,但我还没有学会 我正在努力实现的目标: 用PHP打印包含4级分组(类别、子类别、周和项目)的报告 无需在显示详细信息(订购项目的日期/供应商/价格/数量)以及每周项目和子类别总计时多次重新打印每组值。下面是它的大致外观: 我的做法: 我从MySQL获取给定项目在给定周内的每一次出现,因此每一行都有类别、子类别、周、项目名称、订单日期、供应商名称、价格、数量、ext、订购金

如果我的问题措辞不正确,请原谅,这是我的第一篇帖子。 另外,我要说的是,我正在使用过程化PHP,我确实知道OO PHP的优点,但我还没有学会

我正在努力实现的目标:

用PHP打印包含4级分组(类别、子类别、周和项目)的报告 无需在显示详细信息(订购项目的日期/供应商/价格/数量)以及每周项目和子类别总计时多次重新打印每组值。下面是它的大致外观:

我的做法:

我从MySQL获取给定项目在给定周内的每一次出现,因此每一行都有类别、子类别、周、项目名称、订单日期、供应商名称、价格、数量、ext、订购金额和u/m。每个类别/子类别/周和项目可能会在结果集中重复,因此我需要在PHP中过滤重复

我没有计算MySQL查询中的每周总数或子类别总数,我把它留给了PHP(无论如何,我看不到这样做的方法)

我将MySQL结果存储在名为ord_data的多维数组中。 然后我在这个数组中循环两次-首先计算类别、子类别、周和项目的出现次数,然后将这些总数存储到一个名为cnt_occurrence的单独数组中,以便在打印数据时预先知道总数,以便在正确的位置打印总数。然后,我再次循环ord_数据以打印出数据,同时与cnt_事件进行比较,这样我就知道何时是a)打印新类别、子类别等的时间。b)计算和打印每周项目和子类别总计的时间

我遇到的问题是比较这两个阵列。要做到这一点需要大量复杂的代码。你能告诉我: 1) 我的方法是否合理?? 2) 您是否可以使用单个数组来输入我需要的所有组项的总数(catid、totalcat、SUBATID等)

下面是进行计数的代码示例:

    $cur_catid = "0";
    $prev_catid = "0";
    $num_cats = 0;
    $num_c_rows = 0;
    $cnt_occurences = array();
foreach($ord_数据为$o) {


我不计算MySQL查询中的每周总计或子类别总计
-这可以在MySQL查询中以更干净的方式完成。谢谢,我开始使用带分组的with ROLLUP修饰符,但我遇到的问题是,最后有许多额外的行,这使得数据难以读取。(实际上,我需要在MySQL查询中对7个不同的列进行分组,以便正确地显示数据。因此,我为所有这些分组级别获得了一个额外的行,并且不确定如何删除所有这些列。)我想我可以放弃5列类别、子类别、周、项目或订单日期中任何一列为NULL的任何行。我唯一会保留的摘要记录是那些供应商为NULL的记录。如果您必须进行额外分组以正确格式化数据,您可以将其他3个分组包装在子查询中。不知道您的实际架构,这是我能给你的最接近的答案了。谢谢@SamDufel,我使用GROUP BY子句和ROLLUP修饰符的组合以及一些PHP逻辑来清除额外的“垃圾”摘要行,这些额外的分组级别会导致额外的“垃圾”摘要行。
while(list($k, $v) = each ($o)) 
{

    if ($k == 'catid')
    {

        $cur_catid = $v; 

        if ($cur_catid != $prev_catid)
        {

            $num_cats++; // count distinct cats each item we switch

            if ($prev_catid != 0)
            {

                $cnt_occurences[] = array("catid" => $prev_catid,
                                                    "num_c_rows" => $num_c_rows);

            }