array_diff() devuelve los elementos del primer array que no aparecen en los siguientes. array_intersect() hace lo opuesto: devuelve los que sí aparecen en todos. Son dos funciones de teoría de conjuntos que resultan muy útiles para gestionar permisos, sincronizar etiquetas, detectar cambios en configuraciones o validar entradas de formulario.
array_diff(): elementos que están en A pero no en B
<?php $todos = ['php', 'python', 'javascript', 'rust', 'go']; $instalados = ['php', 'javascript', 'go']; $faltantes = array_diff($todos, $instalados); print_r(array_values($faltantes)); // Array ( [0] => python [1] => rust ) ?>
array_intersect(): elementos comunes a todos
<?php
$permisos_requeridos = ['leer', 'escribir', 'publicar'];
$permisos_usuario = ['leer', 'comentar', 'escribir'];
$tienePermiso = array_intersect($permisos_requeridos, $permisos_usuario);
$faltanPermisos = array_diff($permisos_requeridos, $permisos_usuario);
if (count($faltanPermisos) === 0) {
echo "Acceso concedido";
} else {
echo "Faltan permisos: " . implode(', ', $faltanPermisos);
}
// Faltan permisos: publicar
?>
array_diff_assoc() y array_intersect_assoc(): comparando clave y valor
<?php $config_actual = ['host' => 'localhost', 'puerto' => 3306, 'charset' => 'utf8mb4']; $config_nueva = ['host' => 'localhost', 'puerto' => 5432, 'charset' => 'utf8mb4']; // Detectar qué cambió (clave Y valor distintos) $cambios = array_diff_assoc($config_nueva, $config_actual); print_r($cambios); // Array ( [puerto] => 5432 ) // Qué se mantiene igual $igual = array_intersect_assoc($config_nueva, $config_actual); print_r($igual); // Array ( [host] => localhost [charset] => utf8mb4 ) ?>
Sincronización de etiquetas (añadir y eliminar)
<?php
$etiquetas_actuales = ['php', 'backend', 'tutorial', 'arrays'];
$etiquetas_nuevas = ['php', 'arrays', 'funciones', 'manual'];
// Etiquetas a eliminar: estaban antes pero no ahora
$eliminar = array_diff($etiquetas_actuales, $etiquetas_nuevas);
// ['backend', 'tutorial']
// Etiquetas a añadir: están ahora pero no estaban antes
$añadir = array_diff($etiquetas_nuevas, $etiquetas_actuales);
// ['funciones', 'manual']
echo "Eliminar: " . implode(', ', $eliminar) . "n";
echo "Añadir: " . implode(', ', $añadir) . "n";
?>
Filtrar entradas de formulario con array_intersect_key
<?php
// Campos que el formulario puede enviar
$camposPermitidos = array_flip(['nombre', 'email', 'telefono', 'mensaje']);
// Datos recibidos (pueden incluir campos extra maliciosos)
$datos = [
'nombre' => 'Ana García',
'email' => '[email protected]',
'telefono' => '612345678',
'mensaje' => 'Hola, me interesa el producto',
'admin' => true, // campo inyectado
'rol' => 'superuser' // campo inyectado
];
// Solo dejamos pasar los campos permitidos
$datosSeguros = array_intersect_key($datos, $camposPermitidos);
print_r($datosSeguros);
// Array ( [nombre] => Ana García [email] => [email protected] ... )
// 'admin' y 'rol' quedan excluidos
?>
array_diff_key() para comparar por clave
<?php $campos_bd = ['id' => 1, 'nombre' => 'Ana', 'email' => '[email protected]', 'created_at' => '2024-01-01']; $campos_api = ['nombre' => 'Ana', 'email' => '[email protected]']; // Campos en la BD que la API no devuelve $soloEnBd = array_diff_key($campos_bd, $campos_api); // Array ( [id] => 1 [created_at] => 2024-01-01 ) ?>
La documentación oficial de array_diff() lista todas las variantes disponibles (array_diff_key, array_diff_assoc, array_udiff) y sus respectivos comportamientos.
