2010-02-16 17 views
27

Estoy tratando de escribir unas pocas líneas de código para hacer que una matriz insensible a mayúsculas y minúsculas funcione como un tipo único. Esto es lo que tengo hasta ahora:case-insensitive array_unique

foreach ($topics as $value) { 
    $lvalue = strtolower($value); 
    $uvalue = strtolower($value); 

    if (in_array($value, $topics) == FALSE || in_array($lvalue, $topics) == FALSE || in_array($uvalue, $topics) == FALSE) { 
     array_push($utopics, $value); 
    } 
} 

El problema es la sentencia if. Creo que hay algo mal con mi sintaxis, pero soy relativamente nuevo en PHP y no estoy seguro de qué se trata. ¿Alguna ayuda?

Respuesta

46
function array_iunique($array) { 
    return array_intersect_key(
     $array, 
     array_unique(array_map("StrToLower",$array)) 
    ); 
} 
+1

¡Impresionante! ¡Gracias! – williamg

+11

@ Pentium10: Debe dar crédito a la fuente de su solución: http://www.php.net/manual/de/function.array-unique.php#78801 – sieppl

+3

great find Pentium10, strtolower debería estar entre comillas. – Orlymee

2

Está configurando lvalue y uvalue en la versión minúscula.

$uvalue = strtolower($value); 

debería ser

$uvalue = strtoupper($value); 

Dicho esto, esto podría ser un poco más rápido. El rendimiento de la función se degrada de manera exponencial, mientras que esto será más o menos lineal (a ojo, no es un gran comp-ciencia ...)

<?php 

function array_iunique($ar) { 
    $uniq = array(); 
    foreach ($ar as $value) 
    $uniq[strtolower($value)] = $value; 
    return array_values($uniq); 
} 
?> 
+0

guau.- A veces creo que necesito otro par de ojos. ¡jaja gracias! Sin embargo, eso todavía no lo hace del todo. No estoy seguro de lo que está mal ... Los valores que se muestran son valores que están duplicados (como jQuery y jQuery). Pero con valores que son diferentes (como php y PHP) ninguno aparece. Weird ... – williamg

+0

¡Buena solución! Lo único que me molesta es que la función original 'array_unique' conserva las claves mientras que no, pero supongo que no importa en este caso. –

+1

@Tatu sería difícil preservar las claves cuando descarta algunos de los datos ... ¿qué tecla conservas? ¿El primero, o el último, o uno elegido al azar? – meagar

0

Debería $ Uvalue no estar en mayúsculas? Así

$uvalue = strtoupper($value): 
0

y otra alternativa ...

function array_iunique($topics) { 

    $ltopics = array_map('strtolower', $topics); 
    $cleanedTopics = array_unique($ltopics); 

    foreach($topics as $key => $value) { 
     if(!isset($cleanedTopics[$key])) { 
      unset($topics[$key]); 
     } 
    } 

    return $topics; 

} 

Pentium10 de es mejor sin embargo.

Cuestiones relacionadas