Jump to content
Sign in to follow this  
Herode

[PHP5] array_unique : bug ou éléphant ?

Rate this topic

Recommended Posts

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 ?????? :unsure:

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 :1eye:

Share this post


Link to post
Share on other sites

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 24
groupes[ 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.

Edited by loban

Share this post


Link to post
Share on other sites

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...

Edited by Herode

Share this post


Link to post
Share on other sites

Bon, je m'auto-réponds :P 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.

Edited by Herode

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...