array_unique sensible à la casse ?

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($arrayarray_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.

Etiquettes:

Ajouter un commentaire