array_unique y array_flip en PHP: duplicados y claves

array_unique() elimina valores duplicados de un array. array_flip() intercambia claves y valores. La combinación de ambas tiene un truco conocido: array_flip(array_flip($arr)) elimina duplicados en arrays de strings más rápido que array_unique() porque trabaja como una tabla hash en lugar de comparar cada elemento con todos los demás.

array_unique(): eliminar duplicados

<?php
$etiquetas = ['php', 'backend', 'php', 'arrays', 'backend', 'php'];

$unicas = array_unique($etiquetas);
print_r($unicas);
// Array ( [0] => php [1] => backend [3] => arrays )
// Preserva las claves originales

// Para reindexar
$unicas = array_values(array_unique($etiquetas));
// Array ( [0] => php [1] => backend [2] => arrays )
?>

Flags de comparación en array_unique()

Por defecto array_unique() compara los elementos como strings. Con el segundo argumento puedes controlar el tipo de comparación:

<?php
$valores = [0, false, null, '', '0', 0.0, 'php'];

// SORT_STRING (por defecto): convierte todo a string para comparar
$conString = array_unique($valores, SORT_STRING);
print_r($conString);
// Array ( [0] => 0 [6] => php )  ? 0, false, null, '', '0' y 0.0 son todos '0' o ''

// SORT_NUMERIC: compara numéricamente
$nums = [1, 1.0, '1', 2, '2', 2.0];
$conNumeric = array_unique($nums, SORT_NUMERIC);
print_r($conNumeric);
// Array ( [0] => 1 [3] => 2 )

// SORT_REGULAR: misma lógica que == (comparación débil)
$conRegular = array_unique($valores, SORT_REGULAR);
print_r($conRegular);
?>

array_flip(): intercambiar claves y valores

<?php
$colores = ['rojo' => '#FF0000', 'verde' => '#00FF00', 'azul' => '#0000FF'];

$inverso = array_flip($colores);
print_r($inverso);
// Array ( [#FF0000] => rojo [#00FF00] => verde [#0000FF] => azul )

// Uso habitual: convertir array de valores en mapa para búsquedas
$permisosUsuario = ['leer', 'escribir', 'editar'];
$mapaPermisos    = array_flip($permisosUsuario);
// ['leer' => 0, 'escribir' => 1, 'editar' => 2]

if (isset($mapaPermisos['escribir'])) {
    echo "Tiene permiso de escritura";
}
?>

Búsquedas O(1) con array_flip

La diferencia de rendimiento es relevante cuando tienes arrays de miles de elementos y haces muchas búsquedas. in_array() recorre el array linealmente; isset() sobre el array invertido es una búsqueda por clave hash, constante en tiempo:

<?php
$idsPermitidos = [102, 458, 873, 1204, 3891 /*, ... miles más */];

// Lento si el array es grande: O(n) por búsqueda
if (in_array(458, $idsPermitidos)) { /* ... */ }

// Rápido: O(1) por búsqueda después de la inversión
$mapaIds = array_flip($idsPermitidos);
if (isset($mapaIds[458])) { /* ... */ }
?>

Si tienes duplicados en los valores, array_flip() los elimina y conserva la última clave, lo que lo convierte implícitamente en una alternativa a array_unique() para arrays de strings indexados numéricamente.

Filtrar campos con array_intersect_key

<?php
// Datos de un formulario con campos extra
$formulario = ['nombre' => 'Ana', 'email' => '[email protected]', 'admin' => true, 'edad' => 28];

// Solo queremos guardar estos campos
$camposPermitidos = ['nombre', 'email', 'edad'];

$datos = array_intersect_key(
    $formulario,
    array_flip($camposPermitidos)
);

print_r($datos);
// Array ( [nombre] => Ana [email] => [email protected] [edad] => 28 )
// El campo 'admin' queda excluido
?>

La documentación oficial de array_unique() y la de array_flip() incluyen las advertencias sobre comportamiento con tipos mixtos y duplicados.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP