En esta entrada vamos a ver cómo eliminar datos de un array bien desde una lista blanca o whitelist, bien desde una lista negra o blacklist.
Una lista blanca no es más que un listado de datos o entidades que queremos. Por el contrario una lista negra es un listado de datos o entidades que no queremos.
El manejo de datos en arrays es muy común, y en muchas ocasiones necesitamos hacer un filtro sobre los elementos del array para quedarnos con lo que queremos o eliminar lo que no necesitamos.
Como no hay mejor manera que verlo con un ejemplo (en esta ocasión dos), vamos a ver cómo quedarnos con cierta información de un array a través de una lista blanca y una lista negra.
Eliminar datos de un array desde una whitelist
El primero de los casos que vamos a ver es filtrar un array de datos que tengamos con una lista blanca. Es decir, del array de datos que tenemos nos vamos a quedar única y exclusivamente con los elementos definidos en nuestra whitelist.
<?php
$data = [
'name' => 'John',
'surname' => 'Doe',
'age' => 33,
'gender' => 'male',
'address' => 'street',
'city' => 'Madrid',
'country' => 'Spain',
];
$whitelist = [
'name',
'surname',
'age',
'gender',
];
$result = array_intersect_key( $data, array_flip( $whitelist ) );
Utilizamos la función de PHP array_intersect_key que calcula la intersección de los dos arrays ($data y $whitelist) usando sus claves para la comparación.
En nuestro ejemplo, devolverá un array que contendrá todos los valores de $data que están presentes en $whitelist. Este segundo array lo pasamos por la función de array_flip, que intercambia todas las claves de un array con sus valores asociados.
Por aclarar lo del array_flip, es porque nuestro array $whitelist al no especificar las claves, por defecto son numéricas, es decir, equivale a:
<?php
$whitelist = [
0 => 'name',
1 => 'surname',
2 => 'age',
3 => 'gender',
];
Y lo que conseguimos es intercambiar las claves con los valores, y así filtrar el array de datos como queremos, dándonos como resultado el siguiente array:
<?php
$result = [
'name' => 'John',
'surname' => 'Doe',
'age' => 33,
'gender' => 'male',
];
Eliminar datos de un array desde una blacklist
El segundo de los casos es precisamente lo contrario, cómo filtrar un array de datos que tengamos con una lista negra. Es decir, del array de datos que tenemos vamos a eliminar única y exclusivamente los elementos definidos en nuestra blacklist.
<?php
$data = [
'name' => 'John',
'surname' => 'Doe',
'age' => 33,
'gender' => 'male',
'address' => 'street',
'city' => 'Madrid',
'country' => 'Spain',
];
$blacklist = [
'address',
'city',
'country',
];
$result = array_diff_key( $data, array_flip( $blacklist ) );
En este caso utilizamos la función de PHP array_diff_key que calcula la diferencia entre arrays ($data y $blacklist) usando sus claves para la comparación.
En nuestro ejemplo, compara las claves de $data con las claves de $blacklist. y devuelve la diferencia. Este segundo array lo pasamos por la función de array_flip, para hacer el filtrado con las keys del array de lista negra.
De este modo obtendremos un array con los siguientes datos:
<?php
$result = [
'name' => 'John',
'surname' => 'Doe',
'age' => 33,
'gender' => 'male',
];