array_diff y array_intersect en PHP: comparar arrays

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.

COMPARTE ESTE ARTÍCULO

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