Herode Posté 10 Juillet 2006 Posté 10 Juillet 2006 Bonjour à tous ! Je viens de perdre quelques heures à m'arracher les cheveux sur la disparition d'un poste dans un tableau. Comme je n'arrive pas à trouver mon erreur, voici mon code de test au cas où ça sauterait aux yeux de l'un d'entre vous : echo "1.1 - tableau non dédupliqué : <br/>";$groupes = split( "!", "Editorial!Dossier!*!*" );for ( $j = 0; $j < count( $groupes ); ++ $j ) { echo "groupes[ $j ] = ".$groupes[ $j ]."<br>";}echo "1.2 - tableau dédupliqué : <br/>";$groupes = array_unique( $groupes );for ( $j = 0; $j < count( $groupes ); ++ $j ) { echo "groupes[ $j ] = ".$groupes[ $j ]."<br>";}echo "2.1 - tableau non dédupliqué : <br/>";$groupes = split( "!", "Editorial!Dossier!Dossier!*!*" );for ( $j = 0; $j < count( $groupes ); ++ $j ) { echo "groupes[ $j ] = ".$groupes[ $j ]."<br>";}echo "2.2 - tableau dédupliqué : <br/>";$groupes = array_unique( $groupes );for ( $j = 0; $j < count( $groupes ); ++ $j ) { echo "groupes[ $j ] = ".$groupes[ $j ]."<br>";} Et voici ma sortie html : 1.1 - tableau non dédupliqué : groupes[ 0 ] = Editorial groupes[ 1 ] = Dossier groupes[ 2 ] = * groupes[ 3 ] = * 1.2 - tableau dédupliqué : groupes[ 0 ] = Editorial groupes[ 1 ] = Dossier groupes[ 2 ] = * 2.1 - tableau non dédupliqué : groupes[ 0 ] = Editorial groupes[ 1 ] = Dossier groupes[ 2 ] = Dossier groupes[ 3 ] = * groupes[ 4 ] = * 2.2 - tableau dédupliqué : groupes[ 0 ] = Editorial groupes[ 1 ] = Dossier groupes[ 2 ] = Quelqu'un peut-il me dire où est l'éléphant ?????? NB : J'oubliais un détail amusant : ajouter à la fin du code PHP : echo "2.3 - mais si on passe par join() : <br/>";echo join( $groupes, "," ); donne comme sortie supplémentaire : 2.3 - mais si on passe par join() : Editorial,Dossier,* La petite étoile est de retour
loban Posté 10 Juillet 2006 Posté 10 Juillet 2006 (modifié) Il y a 2 problèmes ! Le premier, c'est que les erreurs ne sont pas affichées, et c'est quand-même mieux en phase de tests. Sinon, tu aurais vu cela : Notice: Undefined offset: 2 in xxxx.php on line 24groupes[ 2 ] = Le deuxième : mets un print_r à la place de ta boucle de lecture pour voir la cause du problème : $groupes = array_unique( $groupes );print_r($groupes); $groupes contient Array ( [0] => Editorial [1] => Dossier [3] => * ) l'étoile est contenu dans $groupes[3] et non dans $groupes[2] comme attendu. Modifié 10 Juillet 2006 par loban
Herode Posté 11 Juillet 2006 Auteur Posté 11 Juillet 2006 (modifié) Ha, bien observé pour l'étoile en [3]. Je ne l'avais pas vu! ! Deux problèmes qui sont en fait le même. J'avais repéré le message d'erreur dans mes logs, en effet. Je suis incapable de savoir d'où ça vient : count() donne bien 3 postes, [2] undefined et un poste en [3] ?????????? :waco: J'ai contourné le problème en faisant mon dédoublonnage à la main, donc ça n'a rien de vital, mais j'aimerais comprendre... ca ressemble à un effet de bord du array_unique(). Est-ce lié au fait qu'il attendrait exclusivement un tableau associatif et qu'un tableau "normalement" indexé le fait déraper ? La doc ne dit rien là-dessus, en tout cas... Modifié 11 Juillet 2006 par Herode
Herode Posté 11 Juillet 2006 Auteur Posté 11 Juillet 2006 (modifié) Bon, je m'auto-réponds En fait, la doc répond bien à ma question précédente : Notez que les clés sont préservées. array_unique() trie les valeurs traitées comme des chaînes dans un premier temps, puis garde la première clé rencontrée pour chaque valeur et ignore les clés suivantes. Cela ne signifie pas que la clé de la première valeur rencontrée du tableau array non trié sera conservé. Ce qui explique la "disparition" de l'index [2] dans mon exemple. La fonction array_unique() interprète bien les tableaux comme des tableaux associatifs. Modifié 11 Juillet 2006 par Herode
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant