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.
