Aller au contenu

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


Sujets conseillés

Posté

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:

Posté (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 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.

Modifié par loban
Posté (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é par Herode
Posté (modifié)

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.

Modifié par Herode

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...