2012-06-14 9 views
32

Tengo una matriz asociativa de datos y tengo una matriz de claves que me gustaría eliminar de esa matriz (manteniendo las claves restantes en el orden original, aunque no es probable que esto sea una restricción).Eliminar las claves de la lista negra de la matriz en PHP

Busco a un un trazador de líneas de PHP para hacer esto.
Ya sé cómo podría recorrer las matrices pero parece que debería haber alguna array_map con unset o array_filter solución fuera de mi alcance.

He buscado un poco, pero no encontré nada demasiado conciso.

Para que quede claro este es el problema de hacer en una línea:

//have this example associative array of data 
$data = array(
    'blue' => 43, 
    'red' => 87, 
    'purple' => 130, 
    'green' => 12, 
    'yellow' => 31 
); 

//and this array of keys to remove 
$bad_keys = array(
    'purple', 
    'yellow' 
); 

//some one liner here and then $data will only have the keys blue, red, green 
+0

hacer una función para hacerlo: 'remove_keys_from_array ($ array, llaves $)'. Y mira eso, ¡toma solo una línea! – Blender

+0

Lo sé pero apuesto a que hay alguna forma de usar las funciones de php para hacerlo ... pero es justo, solo toma una línea – hackartist

Respuesta

87

$out =array_diff_key($data,array_flip($bad_keys));

único que hice fue mirar a través de la lista de Array functions hasta que encontré el que necesitaba (_diff_key).

+2

ok, el truco de array_flip es lo que no sabía. ¡Gracias! – hackartist

+1

Tenía que pensar en esto por un momento. El punto es '$ bad_keys = array (0 => 'purple', 1 => 'yellow')' por lo que las teclas en el array_flip son 'morado', 'amarillo'. Por lo tanto, la diff_key funciona. Ordenado. Gracias, Kolink. – TerryE

+0

Una vez tuve que eliminar por valor (no claves) y terminé con esto: '$ myArr = array (5, 25, 5, 30);' ... THEN ... '$ myArr = & array_diff_key ($ myArr, array_flip (array_keys ($ myArr, 5))); ' – Stphane

14

La solución es de hecho the one provided by Niet the Dark Absol. Me gustaría ofrecer otra solución similar para cualquier persona que está después de algo similar, pero éste utiliza un lista blanca en lugar de una lista negra:

$whitelist = array('good_key1', 'good_key2', ...); 
$output = array_intersect_key($data, array_flip($whitelist)); 

que preservará llaves de $whitelist matriz y eliminar el resto.

0

Esta es una función de lista negra que he creado para matrices asociativas.

if(!function_exists('array_blacklist_assoc')){ 

    /** 
    * Returns an array containing all the entries from array1 whose keys are not present in any of the other arrays when using their values as keys. 
    * @param array $array1 The array to compare from 
    * @param array $array2 The array to compare against 
    * @return array $array2,... More arrays to compare against 
    */ 

    function array_blacklist_assoc(Array $array1, Array $array2) { 
     if(func_num_args() > 2){ 
      $args = func_get_args(); 
      array_shift($args); 
      $array2 = call_user_func_array('array_merge', $args); 
     } 
     return array_diff_key($array1, array_flip($array2)); 
    } 
} 

$sanitized_data = array_blacklist_assoc($data, $bad_keys); 
Cuestiones relacionadas