Réaliser une boucle

t671 Messages postés 1476 Date d'inscription   Statut Membre Dernière intervention   -  
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

Je souhaite réaliser un style d'arbre généalogique. Mais je ne sais pas où placer me boucle pour éviter de réécrire sans cesse la même chose.
1° génération : j'écris le 1° individu, puis je recherche et j'affiche ses conjoints/mariage.
2° génération/enfants : je recherche puis j'affiche les enfants de la génération précédente.
Ensuite je veux afficher la 3° génération, et ainsi de suite jusqu'à la fin de ma base.

Voici ce que j'écris :
/******1° génération*********** 

$select1 = 'SELECT * FROM individus WHERE nom = "'.$nom.'" AND (SUBSTRING(date_naissance, -4) < "'.$date2.'") AND (SUBSTRING(date_naissance, -4) != "") ORDER BY RIGHT(date_naissance,4)'; 
$result1 = mysql_query($select1,$link) or die ('Erreur : '.mysql_error() );
$row1 = mysql_fetch_array($result1);
echo '<table>'; 
echo '<tr height="70"><td style="border:1px solid white; text-align: center; font-size: 10px"><img src="images/garcon.gif">';
echo '<a href="index.php?page=fiche_indiv&famille='.$famille.'&id='.$row1['id'].'" target="_blank"><i>'.$row1['nom'].' '.$row1['prenom'].'</i></a><br>';
if (($row1['sexe'] == M) && (!empty($row1['date_naissance'])))
 { echo 'né : '.$row1['date_naissance'].''; }
else
if (($row1['sexe'] == F) && (!empty($row1['date_naissance'])))
{ echo 'née : '.$row1['date_naissance'].''; }
if (!empty($row1['date_dc']))
 { echo '<br>dcd : '.$row1['date_dc'].''; }
echo '</td>';

 //******** Affichage conjoints/mariage

 $tonarray = array();

 if (!empty($row1['date_mariage_1']))
 {
  $marg_1 = substr($row1['date_mariage_1'], -4);
  $date_marg1 = explode (" ",$row1['date_mariage_1']);
  if ($date_marg1[0] == "Avant")
  { $marg_1 = $marg_1 - 1 ; }
  if ($date_marg1[0] == "Après" || $date_marg1[0] == "Entre" || $date_marg1[0] == "Vers")
  { $marg_1 = $marg_1 + 1 ; }
 }
 if (!empty($row1['date_mariage_2']))
 {
  $marg_2 = substr($row1['date_mariage_2'], -4);
  $date_marg2 = explode (" ",$row1['date_mariage_2']);
  if ($date_marg2[0] == "Avant")
  { $marg_2 = $marg_2 - 1 ; }
  if ($date_marg2[0] == "Après" || $date_marg2[0] == "Entre" || $date_marg2[0] == "Vers")
  { $marg_2 = $marg_2 + 1 ; }
 }
 if (!empty($row1['date_mariage_3']))
 {
  $marg_3 = substr($row1['date_mariage_3'], -4);
  $date_marg3 = explode (" ",$row1['date_mariage_3']);
  if ($date_marg3[0] == "Avant")
  { $marg_3 = $marg_3 - 1 ; }
  if ($date_marg3[0] == "Après" || $date_marg3[0] == "Entre" || $date_marg3[0] == "Vers")
  { $marg_3 = $marg_3 + 1 ; }
 }
 if (!empty($row1['date_mariage_4']))
 {
  $marg_4 = substr($row1['date_mariage_4'], -4);
  $date_marg4 = explode (" ",$row1['date_mariage_4']);
  if ($date_marg4[0] == "Avant")
  { $marg_4 = $marg_4 - 1 ; }
  if ($date_marg4[0] == "Après" || $date_marg4[0] == "Entre" || $date_marg4[0] == "Vers")
  { $marg_4 = $marg_4 + 1 ; }
 }

 $tonarray[0]=array("mariage" => $marg_1 ,"date_mariage" => $row1['date_mariage_1'] , "conjoint" => $row1['num_cj_1'] , "acte_mariage" => $row1['acte_mariage_1']);
 $tonarray[1]=array("mariage" => $marg_2 ,"date_mariage" => $row1['date_mariage_2'] , "conjoint" => $row1['num_cj_2'] , "acte_mariage" => $row1['acte_mariage_2']);
 $tonarray[2]=array("mariage" => $marg_3 ,"date_mariage" => $row1['date_mariage_3'] , "conjoint" => $row1['num_cj_3'] , "acte_mariage" => $row1['acte_mariage_3']);
 $tonarray[3]=array("mariage" => $marg_4 ,"date_mariage" => $row1['date_mariage_4'] , "conjoint" => $row1['num_cj_4'] , "acte_mariage" => $row1['acte_mariage_4']);
 
 sort($tonarray);
 
 for($i=0; $i<=3; $i++)
 {
  if ($tonarray[$i]['conjoint'] != "") 
  { 
     $query4 = 'SELECT id,num_indiv,famille,nom,prenom,sexe,date_naissance,date_dc FROM individus WHERE num_indiv LIKE '.$tonarray[$i]['conjoint'].' ';   //ORDER BY (SUBSTRING($tonarray[$i]['date_mariage'], -4)) ASC
     $result4 = mysql_query($query4) or die(mysql_error());
     $row4 = mysql_fetch_array($result4);

     if (!empty($tonarray[$i]['date_mariage']))
     { echo '<td align="center" style="border:1px solid white; font-size: 10px" >X : '.$tonarray[$i]['date_mariage'].'<br>'; }
     else
     { echo '<td align="center" style="border:1px solid white; font-size: 10px" >X : ?<br>'; }
   if ($row4['sexe'] == M)
   { echo '<img src="images/garcon.gif">'; }
   else
   { echo '<img src="images/fille.gif">'; }
   echo '<a href="index.php?page=fiche_indiv&famille='.$famille.'&id='.$row4['id'].'" target="_blank"><i>'.$row4['nom'].' '.$row4['prenom'].'</i></a><br>'; 
   if (($row4['sexe'] == M) && (!empty($row4['date_naissance'])))
   { echo '   né : '.$row4['date_naissance'].''; }
   else
   if (($row4['sexe'] == F) && (!empty($row4['date_naissance'])))
   { echo '   née : '.$row4['date_naissance'].''; }  
   if (!empty($row4['date_dc']))
   { echo '<br>    dcd : '.$row4['date_dc'].''; }
   echo '</td>';
  }
 } 
echo '</tr><tr><td height="10"></td></tr>';

//******2° génération/enfants*********** 

if ($row1['sexe'] == M)
{  
$select3 = 'SELECT * FROM individus WHERE num_pere = "'.$row1['num_indiv'].'" AND (SUBSTRING(date_naissance, -4) < "'.$date2.'") ORDER BY RIGHT(date_naissance,4)';
$result3 = mysql_query($select3,$link) or die ('Erreur : '.mysql_error() );
}
elseif ($row1['sexe'] == F)
{ 
$select3 = 'SELECT * FROM individus WHERE num_mere = "'.$row1['num_indiv'].'" AND (SUBSTRING(date_naissance, -4) < "'.$date2.'") ORDER BY RIGHT(date_naissance,4)';
$result3 = mysql_query($select3,$link) or die ('Erreur : '.mysql_error() );
}
while ($row3 = mysql_fetch_array($result3)) 
{ 
  echo '<tr>';
  echo '<td></td>
   <td style="font-size: 10px"><img src="images/desc_1.jpg" width="120">3</td>
   <td align="center" style="border:1px solid white; font-size: 10px" >';
   if ($row3['sexe'] == M)
   { echo '<img src="images/garcon.gif">'; }
   else
   { echo '<img src="images/fille.gif">'; }
   echo '<a href="index.php?page=fiche_indiv&famille='.$famille.'&id='.$row3['id'].'" target="_blank"><i>'.$row3['nom'].' '.$row3['prenom'].'</i></a><br>';
   if (($row3['sexe'] == M) && (!empty($row3['date_naissance'])))
   { echo '   né : '.$row3['date_naissance'].''; }
   else
   if (($row3['sexe'] == F) && (!empty($row3['date_naissance'])))
   { echo '   née : '.$row3['date_naissance'].''; }
   if (!empty($row3['date_dc']))
   { echo '<br>    dcd : '.$row3['date_dc'].''; }
  echo '</td>';
  
 //******** Affichage conjoints/mariage

 $tonarray = array();

 if (!empty($row3['date_mariage_1']))
 {
  $marg_1 = substr($row3['date_mariage_1'], -4);
  $date_marg1 = explode (" ",$row3['date_mariage_1']);
  if ($date_marg1[0] == "Avant")
  { $marg_1 = $marg_1 - 1 ; }
  if ($date_marg1[0] == "Après" || $date_marg1[0] == "Entre" || $date_marg1[0] == "Vers")
  { $marg_1 = $marg_1 + 1 ; }
 }
 if (!empty($row3['date_mariage_2']))
 {
  $marg_2 = substr($row3['date_mariage_2'], -4);
  $date_marg2 = explode (" ",$row3['date_mariage_2']);
  if ($date_marg2[0] == "Avant")
  { $marg_2 = $marg_2 - 1 ; }
  if ($date_marg2[0] == "Après" || $date_marg2[0] == "Entre" || $date_marg2[0] == "Vers")
  { $marg_2 = $marg_2 + 1 ; }
 }
 if (!empty($row3['date_mariage_3']))
 {
  $marg_3 = substr($row3['date_mariage_3'], -4);
  $date_marg3 = explode (" ",$row3['date_mariage_3']);
  if ($date_marg3[0] == "Avant")
  { $marg_3 = $marg_3 - 1 ; }
  if ($date_marg3[0] == "Après" || $date_marg3[0] == "Entre" || $date_marg3[0] == "Vers")
  { $marg_3 = $marg_3 + 1 ; }
 }
 if (!empty($row3['date_mariage_4']))
 {
  $marg_4 = substr($row3['date_mariage_4'], -4);
  $date_marg4 = explode (" ",$row3['date_mariage_4']);
  if ($date_marg4[0] == "Avant")
  { $marg_4 = $marg_4 - 1 ; }
  if ($date_marg4[0] == "Après" || $date_marg4[0] == "Entre" || $date_marg4[0] == "Vers")
  { $marg_4 = $marg_4 + 1 ; }
 }

 $tonarray[0]=array("mariage" => $marg_1 ,"date_mariage" => $row3['date_mariage_1'] , "conjoint" => $row3['num_cj_1'] , "acte_mariage" => $row3['acte_mariage_1']);
 $tonarray[1]=array("mariage" => $marg_2 ,"date_mariage" => $row3['date_mariage_2'] , "conjoint" => $row3['num_cj_2'] , "acte_mariage" => $row3['acte_mariage_2']);
 $tonarray[2]=array("mariage" => $marg_3 ,"date_mariage" => $row3['date_mariage_3'] , "conjoint" => $row3['num_cj_3'] , "acte_mariage" => $row3['acte_mariage_3']);
 $tonarray[3]=array("mariage" => $marg_4 ,"date_mariage" => $row3['date_mariage_4'] , "conjoint" => $row3['num_cj_4'] , "acte_mariage" => $row3['acte_mariage_4']);
 
 sort($tonarray);
 
 for($i=0; $i<=3; $i++)
 {
  if ($tonarray[$i]['conjoint'] != "") 
  { 
     $query4 = 'SELECT id,num_indiv,famille,nom,prenom,sexe,date_naissance,date_dc FROM individus WHERE num_indiv LIKE '.$tonarray[$i]['conjoint'].' ';   //ORDER BY (SUBSTRING($tonarray[$i]['date_mariage'], -4)) ASC
     $result4 = mysql_query($query4) or die(mysql_error());
     $row4 = mysql_fetch_array($result4);

     if (!empty($tonarray[$i]['date_mariage']))
     { echo '<td align="center" style="border:1px solid white; font-size: 10px" >X : '.$tonarray[$i]['date_mariage'].'<br>'; }
     else
     { echo '<td align="center" style="border:1px solid white; font-size: 10px" >X : ?<br>'; }
   if ($row4['sexe'] == M)
   { echo '<img src="images/garcon.gif">'; }
   else
   { echo '<img src="images/fille.gif">'; }
   echo '<a href="index.php?page=fiche_indiv&famille='.$famille.'&id='.$row4['id'].'" target="_blank"><i>'.$row4['nom'].' '.$row4['prenom'].'</i></a><br>'; 
   if (($row4['sexe'] == M) && (!empty($row4['date_naissance'])))
   { echo '   né : '.$row4['date_naissance'].''; }
   else
   if (($row4['sexe'] == F) && (!empty($row4['date_naissance'])))
   { echo '   née : '.$row4['date_naissance'].''; }  
   if (!empty($row4['date_dc']))
   { echo '<br>    dcd : '.$row4['date_dc'].''; }
   echo '</td>';
  }
 }
 if ($row3['sexe'] == M)
 {  
 $select3 = 'SELECT * FROM individus WHERE num_pere = "'.$row3['num_indiv'].'" AND (SUBSTRING(date_naissance, -4) < "'.$date2.'") ORDER BY RIGHT(date_naissance,4)';
 $result3 = mysql_query($select3,$link) or die ('Erreur : '.mysql_error() );
 }
 elseif ($row3['sexe'] == F)
 { 
 $select3 = 'SELECT * FROM individus WHERE num_mere = "'.$row3['num_indiv'].'" AND (SUBSTRING(date_naissance, -4) < "'.$date2.'") ORDER BY RIGHT(date_naissance,4)';
 $result3 = mysql_query($select3,$link) or die ('Erreur : '.mysql_error() );
 }
echo '</tr><tr><td height="10"></td></tr>';
}  

.............etc...............10° génération ..............


Mais je n'arrive pas à faire la boucle pour lire toute la base ......
Là, j'affiche le 1° individu de la 2° génération et son 1° enfant !
Où dois-je placer ma boucle ?

Merci

2 réponses

jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
Bonjour,

Pour ce genre de chose... il est préférable d'utiliser la représentation intervallaire. (ou arbre intervallaire)
Regarde ces tutos :
https://stephanelegrand.wordpress.com/2009/01/03/gestion-dune-structure-darbre-sous-mysql/

https://zestedesavoir.com/tutoriels/250/la-representation-intervallaire/#3-4799_manipulation-de-noeuds

Grâce à cette méthode il est facile d'obtenir tout ou parti d'un arbre (arbre / noeud / branche... appelle ça comme tu veux ^^ )

0
t671
 
Merci jordane45 ! C'est quand même complexe ............ !!!
En plus, ma base existe déjà et je ne vois pas comment rajouter les colonnes gauche et droite pour les remplir correctement.
Par contre, dans ma base, chaque individu contient un champ avec l'id du père et l'id de la mère. Mais je ne peux pas faire une formule mathématique avec çà !?
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
Non.
Il n'y a pas de forlmule miracle .... sinon... pourquoi nous serions nous embêter à créer la gestion Intervallaire .... ;-)

Si tu tiens à conserver ta BDD en l'état ..... tu n'auras d'autre choix que de faire du récursif....
0