52

我有一个关联的数据数组,并且我有一个要从该数组中删除的键数组(同时保持其余键的原始顺序——这可能不是一个约束)。

我正在寻找一个单行的 php 来做到这一点。
我已经知道如何遍历数组,但似乎应该有一些我无法array_map掌握unsetarray_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
4

3 回答 3

134

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

我所做的只是查看Array 函数列表,直到找到我需要的那个 ( _diff_key)。

于 2012-06-14T04:50:13.140 回答
30

解决方案确实是Niet the Dark Absol提供的解决方案。我想为追求类似事情的任何人提供另一种类似的解决方案,但这个解决方案使用白名单而不是黑名单

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

这将保留$whitelist数组中的键并删除其余键。

于 2016-01-03T09:21:25.403 回答
0

这是我为关联数组创建的黑名单函数。

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);
于 2016-04-25T11:10:25.300 回答