[RESOLU] array_unique() qui ne fonctionne pas bien ?

Eléphant du PHP | 218 Messages

14 oct. 2014, 18:37

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...
Cadeaux personnalisés pour toute la famille :
https://cadeauxplaisir.com/

ViPHP
ViPHP | 1996 Messages

15 oct. 2014, 00:17

Essayes de le trier avant pour voir :
print_r(array_unique(sort($array_keywords)));
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

Eléphant du PHP | 218 Messages

15 oct. 2014, 11:47

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 ?
Cadeaux personnalisés pour toute la famille :
https://cadeauxplaisir.com/

Mammouth du PHP | 571 Messages

15 oct. 2014, 11:52

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);

ViPHP
ViPHP | 1996 Messages

15 oct. 2014, 11:53

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.
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

Eléphant du PHP | 218 Messages

15 oct. 2014, 13:25

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 ? :|
Cadeaux personnalisés pour toute la famille :
https://cadeauxplaisir.com/

ViPHP
ViPHP | 1996 Messages

15 oct. 2014, 13:33

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)
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

Eléphant du PHP | 218 Messages

15 oct. 2014, 14:52

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.
Cadeaux personnalisés pour toute la famille :
https://cadeauxplaisir.com/