IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Tableaux] Foreach renvoie des valeurs double en php4


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2005
    Messages : 13
    Par défaut [Tableaux] Foreach renvoie des valeurs double en php4
    Bonjour. J'ai un problème de compatibilité. J'ai développé un petit gestionnaire de mailing liste en php5. Mais je dois l'installé sur un serveur php4 pour quelqu'un et après avoir transformé une partie du code, il reste un problème que je n'arrive pas à corriger: Si un courriel est abonnés à plusieur groupes, il me cré des doublons de la ligne ( si le courriel est en dans deux groupes, j'ai deux lignes identiques en sortie dans mon tableau...). Voici le code correspondant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    $tabCourrielComp = CourrielCollection::GetAllWithGrp();
    // <script type="text/javascript" src="Inc/tablesort.js"></script>
    $table_html = '
     
    <script type="text/javascript" src="Inc/tablefilter.js"></script>
    <script type="text/javascript" src="Inc/jquery-latest.pack.js"></script>
    <script type="text/javascript" src="Inc/jquery.jeditable.js"></script>
    <table id="theTable" cellpadding="0" cellspacing="0" class="sortable-onload-3 rowstyle-alternative" > 
    	<thead>
      		<tr>
        		<th class="sortable">Nom</th>
        		<th class="sortable">Prénom</th>
        		<th class="sortable">Courriel</th>';
     
    $tabGroupe = MailGrpCollection::GetAll();
     
    $nbgroup = 0;
    $j=1;
    foreach ($tabGroupe as $grp)
    {
    	$table_html .= '<th class="">'.$grp->GetTitre('fr').'</th>';
    	${"Grp_".$j} = $grp->GetId();
    	$nbgroup++;$j++;
    }
     
    $table_html .= '
    			<th class=""> </th>
    		</tr>
      	</thead>
     
      <tbody>';
    foreach ($tabCourrielComp as $courriel)
    {
    	for ($i=1;$i<=$nbgroup;$i++)
    			{
    				${"check_".$i} = '';${"value_".$i} = 'class="noninscrit">-</span>';
    			}
    	foreach ($tabCourrielComp as $courriel2)
    	{
    		if ($courriel->GetCourriel() == $courriel2->GetCourriel() AND $courriel->GetIdGrpCour() != $courriel2->GetIdGrpCour() AND $courriel->GetCourriel() != null)
    		{
    			for ($i=1;$i<=$nbgroup;$i++)
    			{
    				if (${"Grp_".$i} == $courriel2->GetIdGrpCour()) {${"check_".$i} = 'checked="checked"';${"value_".$i} = 'class="inscrit">Inscrit</span>';}
    			}
    			$courriel2->SetCourriel(null);
    		}		
    	}
    	if ($courriel->GetCourriel() != null)
    	{
    		for ($i=1;$i<=$nbgroup;$i++)
    			{
    				if (${"Grp_".$i} == $courriel->GetIdGrpCour()) {${"check_".$i} = 'checked="checked"';${"value_".$i} = 'class="inscrit">Inscrit</span>';}
    			}
    		$table_html .= '
      		<tr id="tr_'.$courriel->GetId().'">
      			<td id="nom_'.$courriel->GetId().'" class="editable">'.$courriel->GetNom().'</td>
        		<td id="prenom_'.$courriel->GetId().'" class="editable">'.$courriel->GetPrenom().'</td>
        		<td id="courriel_'.$courriel->GetId().'" class="editable">'.$courriel->GetCourriel().'</td>
      		';
    		for ($i=1;$i<=$nbgroup;$i++)
    			{
    				$table_html .= '<td><input id="check_'.$courriel->GetId().${"Grp_".$i}.'" value="" type="checkbox" onclick="changeStatut('.$courriel->GetId().${"Grp_".$i}.','.$courriel->GetId().','.${"Grp_".$i}.')" '.${"check_".$i}.'/><span id="statut_'.$courriel->GetId().${"Grp_".$i}.'" '.${"value_".$i}.'</td>';
    			}
    		$table_html .= '
    			<td id="suppr_'.$courriel->GetId().'" class="suppr"><img src="Images/Btn/trash_16.gif" style="cursor: pointer;" title="Supprimer" onclick="supprCourriel('.$courriel->GetId().')" alt="Cliquer pour supprimer le courriel."/></td>
    		</tr>';
    	}
    }
    Je sais que les foreach posent problèmes avec php4, mais je ne vois pas comment faire autrement pour trier mon résultat...
    Merci.

  2. #2
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    Salut,
    si tu veux avoir acces en écriture tu peux utiliser des for(i) à la place.
    foreach travaille sur une copie du tableau. Normalement tu peux passer la référence du tableau avec & mais je crois que ca marche qu'en php 5 (à moins que ce soit à partir du 4.3)
    Bye

  3. #3
    Membre Expert
    Avatar de yiannis
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 494
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 494
    Par défaut
    bonjour,

    Je sais que les foreach posent problèmes avec php4...


    j'utilise php4 et j'ai une mauvaise manie, j'utilise tres tres souvent les tableaux. Allant des fois jusqu'a des tableaux a 6 dimensions et, je n'ai jamais eu aucun probleme avec le foreach()

    d'ou tiens tu cette info?

    bon sinon pour ton probleme, je n'ai pas la solution, mais je peux te proposer un palliatif. Utilises un array_unique() sur ton tableau, ca te le dedoublonnera.

  4. #4
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    Pour être plus précis le problème vient sans doute de $courriel2->SetCourriel(null); qui travaille en fait sur une copie de l'objet et non sur l'objet contenu dans ton tableau de base.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2005
    Messages : 13
    Par défaut
    Oui je pense aussi que cela vient du setcourriel()=null mais si je ne fais pas ca, il va me sortir plusieur fois le courriel...
    Pour le array_unique, ca ne marche pas, car ici ce ne sont pas vraiment des doublons, chaque objet est presque similaire sauf au niveau des groupes d'abonnés... Comme ce nombre de groupe est dynamique, je n'ai pas le choix de faire ca (avoir plusieurs tables)... Sinon le pb serait réglé depuis longtemps...

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2005
    Messages : 13
    Par défaut
    J'ai trouvé! Comme foreach ne travail en php4 que sur une copy du tableau, toutes les modifications sur mon objet sont ignorées... Donc utiloisant la référence, hop ça marche!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    foreach (array_keys($tabCourrielComp) as $index)
    {
    	$courriel = & $tabCourrielComp[$index];
    	for ($i=1;$i<=$nbgroup;$i++)
    			{
    				${"check_".$i} = '';${"value_".$i} = 'class="noninscrit">-</span>';
    			}
    	foreach (array_keys($tabCourrielComp) as $index2)
    	{
    		$courriel2 = & $tabCourrielComp[$index2];

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Tableaux] Tableau : compter des valeurs identiques
    Par renaud26 dans le forum Langage
    Réponses: 6
    Dernier message: 07/10/2008, 13h51
  2. [Tableaux] Comment aditionner des valeurs d'un tableau
    Par vimarty dans le forum Langage
    Réponses: 3
    Dernier message: 04/01/2008, 12h34
  3. Recordset vide alors que la requete renvoie des valeurs
    Par lepiou dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 07/06/2006, 11h36
  4. Réponses: 2
    Dernier message: 28/03/2006, 12h45
  5. requette qui renvoi des ligne double
    Par fehmitn dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 13/09/2004, 23h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo