Excluir elementos de un array en PHP

Consejito rápido para programación en PHP.

Supongamos que tienes un array con 20 elementos, y quieres excluir 2 claves, pero no quieres especificar las 18 claves restantes. Tal vez 20 no es mucho, pero si el array ya incluye 30, 40 o más claves, se empieza a complicar progresivamente, además, si agregas una nueva clave, tienes que agregarla en dos lugares. Claro, tienes la función de array_filter, pero te permite filtrar por valor, no por claves. Observa también, que esto es todo lo contrario de array_merge en la que tomas elementos de un nuevo array para adjuntarlos/superponerlos con el array original.

Entonces ¿cómo excluir claves de un array? Podrías hacerlo con un loop en el que compares cada clave con las que deseas excluir y vayas construyendo un nuevo array con las entradas no excluidas. Pero puedes hacerlo también con dos funciones de PHP: array_intersect_key y array_diff:


<?php
$original=array('rojo' => 20, 'verde' => 50, 'azul' => 90, 'negro' => 10);
$excluir=array('rojo' => -1, 'negro' => -1); //solo deseamos claves de azul y verde
$extraccion = array_diff($original, array_intersect_key($original, $excluir));
?>

¿Captas el truco? Con la primera de las funciones de array, array_intersect_key, obtenemos las claves del original. ¿Pero no las queríamos excluir? Sí, y por eso lo que obtenemos es el array_diff, entre el array con las claves *que no vamos a querer* y el array original, obteniendo así un array nuevo con solo las claves deseadas.

Si te preguntas si no podemos hacer lo mismo con únicamente un array_diff, pasándole un array con las claves a excluir, pues no, no se puede porque si los valores de las claves no coinciden con los del array original, vuelve a incluir las claves que queríamos omitir por tener valores distintos, son parte del diff.

Si quieres experimentar con estas funciones, puedes usar las siguientes líneas y cargarlo en un script:


<?php
$o=array('a'=>'1', 'b'=>'2', 'c'=>'3');
$exclude=array('a'=>-1, 'b'=>-1);
echo 'diff: ';
print_r(array_diff($o, $exclude));
echo 'intersect_key: ';
print_r(array_intersect_key($o, $exclude));
echo 'excluded: ';
print_r(array_diff($o, array_intersect_key($o, $exclude)));
?>

Y por último, los valores de -1 en las claves que queremos excluir, no tienen absolutamente nada que ver…

Bonita semana para todos.

Un Comentario

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s