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;
}
l'extrait aiderait beaucoup – genesis
a ajouté un certain code d'horreur horrible – dmp