2011-06-16 4 views
0

J'ai un ensemble de données structurées que j'essaie de fusionner, en fonction d'un ensemble de conditions.Fusion de structures de données

Il existe un ensemble de lignes, renvoyées par le db. Chaque rangée a un identifiant de cours et un identifiant de discipline. Il y a une quantité égale de disciplines dans chaque cours, mais certaines disciplines sont répétées dans les deux cours. Je veux construire une structure de données où si la discipline est dans les deux cours, alors elle apparaît seulement une fois sur une ligne dans une nouvelle structure de données, et rien d'autre, mais s'il y a deux disciplines inégalées, alors elles sont toutes les deux inclus dans un nouveau cours.

Le code que j'utilise jusqu'à présent filtre et supprime les clés qui sont dupliquées et les ajoute à un nouveau tableau. Cela fonctionne bien. Cependant, parce que je ne peux pas contrôler l'ordre dans lequel les données arrivent (ne me le demandez pas), j'ai de la difficulté à m'assurer que chaque ligne a une discipline qui apparaît dans les deux cours, ou une de chaque.

Je pense que j'ai besoin de techniques pour résoudre ce problème, et je me demandais si quelqu'un avait déjà rencontré ça auparavant. Je veux éviter de faire plusieurs boucles consécutives, si possible.

Merci.

modifier: Code désordre et horrible ci-dessous:

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; 


    } 
+0

l'extrait aiderait beaucoup – genesis

+0

a ajouté un certain code d'horreur horrible – dmp

Répondre

2

Vous avez dit « ne demande pas », mais je dois: pourquoi ne peut vous contrôler l'ordre des lignes? N'êtes-vous pas celui qui écrit la requête de la base de données?

Si vous pensez que la correction de l'ordre des lignes vous aidera à analyser et à mieux construire une nouvelle structure de données, pourquoi ne pas faire du tri des lignes la première étape de votre processus? Ou, l'ensemble de données est-il trop grand?

Vous pourriez trouver certaines des manipulations de jeu de tableaux de PHP à utiliser. c'est-à-dire array_diff, array_intersect_key etc.