合并数据结构

时间:2011-06-16 19:09:46

标签: php

我有一组结构化数据,我试图根据一组条件合并在一起。

从db返回一组行。每行都有一个课程ID和一个纪律ID。每门课程都有相同数量的学科,但两门课程都重复了一些学科。

我想构建一个数据结构,如果该学科在两个课程中,那么它只在新数据结构中出现一次,没有别的,但如果有两个不匹配的学科,那么它们都包括在内在一个新的课程。

我目前使用的代码是过滤和删除重复的密钥,并将它们添加到新的数组中。这很好用。

但是,因为我无法控制数据的来源(不要问),我遇到了麻烦,确保每一行都有一个既可以出现在两个课程中,也可以是其中一个。

我认为我需要一些技巧来帮助解决这个问题,并且想知道是否有人曾经遇到过此问题。如果可能的话,我想避免多次连续循环。

感谢。

编辑:下面的杂乱而可怕的代码:

function buildDisciplineMap(){
        $sql = "SELECT  [idcurso]
                          ,[idversao]
                          ,[ordem]
                          ,[bloco]
                          ,[obsbloco]
                          ,[iddisciplina] as idd
                          ,cast([iddisciplina] as TEXT) as iddisciplina 
                          ,[descdisciplina]
                          ,[iddepartamento]
                          ,[descdepartamento]
                          ,[ects]
                          ,[horas]
                          ,[idregente]
                          ,[regente]
                          ,[idregente1]
                          ,[regente1]
                          ,[idregente2]
                          ,[regente2]
                          ,[idregente3]
                          ,[regente3]
                          ,cast([objectivos] as TEXT) as objectivos
                          ,cast([programa] as TEXT) as programa
                          ,[descdisciplina_en]
                          ,cast([objectivos_en] as TEXT) as objectivos_en
                          ,cast([programa_en] as TEXT) as programa_en
                      FROM [proffile2].[dbo].[vw_site_CursosDisciplinas_FEG]
                      where idcurso = '3512 GE' or idcurso = '3513 ECON' order by idcurso desc ";
        $discs = $this->returnObject($sql);

        $map = new stdClass();

        // find blocos, and titles

        foreach ($discs as $key => $value) {
            if (isset($map->bloco[$value->bloco])) {
                // block already exists
            } else {
                #echo "making new block";
                $map->bloco[$value->bloco] = new stdClass();


            }

            if (strlen($value->obsbloco)>1) {
                $map->bloco[$value->bloco]->title = $value->obsbloco;
            }

        }

        foreach ($map->bloco as $keybloco => $value) {

            $map->bloco[$keybloco]->lines = array();

            $processed_ids = array();

            foreach ($discs as $kd => $vd) {

                if ($vd->bloco == $keybloco) {

                    // check if this discipline occurs more than once in this block
                    foreach ($discs as $kdd => $vdd) {
                        if ($vdd->iddisciplina == $vd->iddisciplina && $kdd != $kd && !in_array($kd,$processed_ids) && !in_array($kdd,$processed_ids)) {


                            // this discipline is for both courses
                            $details = array();
                            $details['both'] = $vd;


                            $map->bloco[$keybloco]->lines[] = $details;
                            array_push($processed_ids, $kd, $kdd);
                            unset($discs[$kdd]);
                            unset($discs[$kd]);
                            break;
                        }


                    }

                }
            }
        }

        $processed_ids = array();

        foreach ($discs as $key => $value) {
            echo $value->idcurso."\n";
        }

        foreach ($discs as $kd => $vd) {

            $bloco = $vd->bloco;
            $lastidx =sizeof($map->bloco[$bloco]->lines)-1;

            $line = $map->bloco[$bloco]->lines[$lastidx];

            echo sizeof($map->bloco[$bloco]->lines);
            #pr($line);
            if (isset($line['both'])) {
                echo "omog - \n ";
                $map->bloco[$bloco]->lines[][$vd->idcurso] = $vd;
                unset($discs[$kd]);
                continue;
            }
            #pr($line['both']->idcurso);

            foreach ($map->bloco[$bloco]->lines as $k => $v) {

                echo $k."-";

                 #echo $v['3513 ECON']->idcurso;
            }

            if ($line[$vd->idcurso]) {
                echo 'add';
                $map->bloco[$bloco]->lines[][$vd->idcurso] = $vd;
            } else {
                echo 'fill';
                $map->bloco[$bloco]->lines[sizeof($map->bloco[$bloco]->lines)-1][$vd->idcurso] = $vd;
            }






        }
        echo sizeof($discs);

        return $map;


    }

1 个答案:

答案 0 :(得分:2)

你说“不要问”,但我必须:为什么你不能控制行的顺序?你不是那个写数据库查询的人吗?

如果您认为修复行的顺序将有助于您更好地解析和构建新的数据结构,为什么不在行程的第一步对行进行排序?或者,数据集是否太大?

你可能会发现一些PHP的数组集操作是有用的。即array_diffarray_intersect_key等。