web-dev-qa-db-fra.com

Supprimer les clés de la liste noire du tableau dans PHP

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
36
hackartist

$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).

97

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.

15
Trix

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);
0
TarranJones