Question du jour : array_unique est-il sensible à la casse ? array_unique est une fonction PHP qui permet de supprimer des doublons dans un tableau PHP.
Réponse :
<?php
print_r(array_unique(array('a', 'b', 'a')));
/* Affiche :
Array
(
[0] => a
[1] => b
)
*/
print_r(array_unique(array('a', 'b', 'A')));
/* Affiche :
Array
(
[0] => a
[1] => b
[2] => A
)
*/
?>
La réponse est donc Oui...
Évidemment, c'est une version insensible à la casse dont j'ai besoin. Heureusement qu'il y les commentaires sur la documentation PHP. La fonction proposée par un dénommé mnbayazit ci-dessous résout mon problème :
<?php
function array_iunique($array) {
return array_intersect_key($array, array_unique(array_map('strtolower', $array)));
}
print_r(array_iunique(array('déjà', 'Eté', 'Déjà')));
/* Affiche :
Array
(
[0] => déjà
[1] => Eté
)
*/
?>
On utilise array_map combiné à strtolower pour obtenir une version du tableau où toutes les chaînes sont en minuscules, puis on utilise array_unique pour supprimer les doublons. Enfin, on utilise array_intersect_key pour ne retenir du tableau original que les clés qui ont été conservées dans le résultat de l'appel à array_unique. Ça fonctionne car array_unique préserve les clés.
Si on veut utiliser cette fonction avec des chaînes UTF-8 comprenant des caractères non présent dans ISO-8859-1, on peut utiliser une fonction anonyme et mb_strtolower :
<?php
function array_iunique($array) {
return array_intersect_key(
$array,
array_unique(
array_map(
function($text) {
return mb_strtolower($text, 'UTF-8');
},
$array
)
)
);
}
print_r(
array_iunique(
array(
'De ? à ?',
'de ? à ?'
)
)
);
/* Affiche
Array
(
[0] => De ? à ?
)
*/
?>
Notez que c'est la casse de la première valeur trouvée qui est conservée.
Ajouter un commentaire