Page 1 sur 1

array_unique() qui ne fonctionne pas bien ?

Posté : 14 oct. 2014, 18:37
par wwwbillgates
Bonjour, je marache les cheuveux avec array_unique() qui ne fonctionne pas bien. En effet j'ai :

foreach($array_keywords AS $keywords_separation) {
	if (isset($keywords_ensemble)) {
		$keywords_ensemble = $keywords_ensemble . "\n" . $keywords_separation;
	}
	else {
		$keywords_ensemble = $keywords_separation;
	}						
}
dans un textarea pour l'affichage. Ensuite j' en récupère un POST dans une autre page et je fais :
$array_keywords = explode("\n", $keywords);
print_r(array_unique($array_keywords));

Et là tous les doublons deviennent uniques hormis les 2 derniers lorsqu'ils se trouvent à la fin de mon array ?
J'ai bien essayé de mettre un trim() à droite à gauche au cas ou, mais rien ne change ? :?

Voici par exemple se que j'obtiens :

Array
(
[0] => a

[2] => u

[5] => b

[6] => b
)

tous ont disparu, hormis les 2 de la fin...

Re: array_unique() qui ne fonctionne pas bien ?

Posté : 15 oct. 2014, 00:17
par Aureusms
Essayes de le trier avant pour voir :
print_r(array_unique(sort($array_keywords)));

Re: array_unique() qui ne fonctionne pas bien ?

Posté : 15 oct. 2014, 11:47
par wwwbillgates
Alors pour :

Array
(
[0] => a
[1] => d
[2] => f
[3] => a
[4] => b
[5] => b
)

Avec un array_unique() j'obtiens :

Array
(
[0] => a
[1] => d
[2] => f
[4] => b
[5] => b
)

Et si j'utilise sort() de tel sorte :
sort($array_keywords);
print_r(array_unique($array_keywords));
car print_r(array_unique(sort($array_keywords))); créé une erreur, alors j'obiens le résultat dans lordre alphabétique simplement :

Array
(
[0] => a
[2] => b
[3] => b
[4] => d
[5] => f
)

Une idée ?

Re: array_unique() qui ne fonctionne pas bien ?

Posté : 15 oct. 2014, 11:52
par yann18
avec \n c'est sûr que les espaces sont pris en compte.
à la place de print_r, essaies avec var_dump pour voir la taille de chaque string:

$array_keywords = explode("\n", $keywords);
$tbl = array_unique(array_map('trim', $array_keywords));
var_dump($tbl);

Re: array_unique() qui ne fonctionne pas bien ?

Posté : 15 oct. 2014, 11:53
par Aureusms
Bonjour,

Pas exactement : le doublon "a" a été trouvé . C'est comme ci "b" != "b".
On va vérifier le type de variable enregistré :
echo '<pre>'; 
echo var_dump(array_unique($array_keywords)); 
echo '</pre>';
Les balises <pre> permettent de conserver l'indentation, c'est juste pour l'affichage.

Re: array_unique() qui ne fonctionne pas bien ?

Posté : 15 oct. 2014, 13:25
par wwwbillgates
Hum effectivement il y a des caractère invisibles en trop pour chaques entrées, hormis la dernière, celle qu'il ne vois pas comme doublon :

array (size=7)
0 => string 'a' (length=2)
1 => string 'c' (length=2)
2 => string 'f' (length=2)
3 => string 'r' (length=2)
4 => string 'c' (length=2)
5 => string 'a' (length=2)
6 => string 'a' (length=1)

Merci pour cette fonction que je ne connaissai pas, mais d'où peut alors bien venir ces caractères invisible, et comment m'en débarasser vu que le trim() n'a pas l'air de fonctionner ? :|

Re: array_unique() qui ne fonctionne pas bien ?

Posté : 15 oct. 2014, 13:33
par Aureusms
Il te faut comprendre pourquoi et quels caractères spéciaux n'est pas retiré.
Utilise ord() ou mb_ord() pour obtenir le code Ascii du caractères qui t'embête. (http://php.net/manual/fr/function.ord.php)

Il ya un exemple sur cette page qui te permet de donner tous les caractères ASCII d'une chaine (n°4)

Re: array_unique() qui ne fonctionne pas bien ?

Posté : 15 oct. 2014, 14:52
par wwwbillgates
Alors ca y est j'ai trouvé !
Grace à la fonction que tu ma donné j'ai trouvé qu'il s'agissait de retour chariot et saut de ligne. Du coup je me suis rendu compte que j'utilisai mal le trim car je l'ai fais sur le array au lieu de le faire sur les résultats. Donc si sa peut aider, pour faire un trim sur chaques entrés d'un array il faut faire :
function TrimArray(&$value) {
    $value = trim($value);
}

$array_keywords = explode("\n", $keywords);
				
array_walk($array_keywords, 'TrimArray');

sort($array_keywords);			
print_r(array_unique($array_keywords));
Merci beaucoup pour votre aide qui ma orienté dans la bonne direction et ma permis de comprendre mon erreur.