J'ai un tableau associatif de données et j'ai un tableau de clés que je voudrais supprimer de ce tableau (tout en conservant les clés restantes dans l'ordre d'origine - non que cela risque d'être une contrainte).
Je cherche unone linerof php pour faire ceci.
Je sais déjà comment je pourrais parcourir les tableaux, mais il semble qu'il devrait y avoir une solution array_map
avec unset
ou array_filter
juste à l'extérieur de ma portée.
J'ai cherché un peu autour mais rien trouvé trop concis.
Soyons clairs, c’est le problème à résoudre dansune ligne:
//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
$out =
array_diff_key
($data,
array_flip
($bad_keys));
Je n'ai fait que regarder dans la liste des Fonctions de tableau jusqu'à ce que je trouve celui dont j'avais besoin (_diff_key
).
La solution est bien celle fournie par Niet the Dark Absol . J'aimerais proposer une autre solution similaire à quiconque souhaite poursuivre une action similaire, mais celle-ci utilise un liste blanche au lieu d'un liste noire
$whitelist = array( 'good_key1', 'good_key2', ... );
$output = array_intersect_key( $data, array_flip( $whitelist ) );
Ce qui préservera les clés du tableau $whitelist
et supprimera le reste.
C'est une fonction de liste noire que j'ai créée pour les tableaux associatifs.
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);