it-roy-ru.com

Удалить черный список ключей из массива в PHP

У меня есть ассоциативный массив данных, и у меня есть массив ключей, которые я хотел бы удалить из этого массива (сохраняя оставшиеся ключи в исходном порядке - не то, чтобы это, вероятно, было ограничением).

Я ищуодин вкладышPHP для этого.
Я уже знаю, как можно перебирать массивы, но, похоже, должен быть какой-то код array_map с решением unset или array_filter вне моей хватки.

Я искал немного, но не нашел ничего слишком краткого.

Чтобы было ясно, эту проблему нужно сделать водной строке:

//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));

Все, что я делал, это просматривал список функций массива , пока не нашел нужную мне (_diff_key).

97
Niet the Dark Absol

Решение действительно решение, предоставленное Niet the Dark Absol . Я хотел бы предложить другое похожее решение для тех, кто ищет подобные вещи, но в этом используется белый список вместо черного списка:

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

Который сохранит ключи из массива $whitelist и удалит остальные.

15
Trix

Это функция внесения в черный список, которую я создал для ассоциативных массивов.

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