Вернуть все элементы массива, кроме данного ключа - PullRequest
17 голосов
/ 01 марта 2011

Простой, мне просто интересно, есть ли чистый и красноречивый способ возврата всех значений из ассоциативного массива, которые не соответствуют заданному ключу (ключам)?

$array = array('alpha' => 'apple', 'beta' => 'banana', 'gamma' => 'guava');

$alphaAndGamma = arrayExclude($array, array('alpha'));
$onlyBeta      = arrayExclude($array, array('alpha', 'gamma'));

function arrayExclude($array, Array $excludeKeys){
    foreach($array as $key => $value){
        if(!in_array($key, $excludeKeys)){
            $return[$key] = $value;
        }
    }
    return $return;
}

Это то, что я (собираюсь использовать), однако, есть ли более чистые реализации, что-то, что я пропустил в руководстве, возможно?

Ответы [ 7 ]

25 голосов
/ 01 марта 2011

Вы можете просто unset значение:

$alphaAndGamma = $array;
unset($alphaAndGamma['alpha']);

Редактировать: Это стало понятнее.Вы можете скопировать массив, присвоив его другой переменной.

или в функции:

function arrayExclude($array, Array $excludeKeys){
    foreach($excludeKeys as $key){
        unset($array[$key]);
    }
    return $array;
}
18 голосов
/ 12 октября 2016

Хотя этот вопрос слишком старый и на него есть несколько ответов, но я выкладываю решение, которое может быть кому-то полезно.

Вы можете получить все элементы массива из предоставленного ввода, кроме определенных ключей, которые вы исключили, используя:

$result = array_diff_key($input, array_flip(["SomeKey1", "SomeKey2", "SomeKey3"]));

Это исключит элементы из массива $input, имеющие ключи SomeKey1, SomeKey2 и SomeKey3, и вернет все остальные в переменную $result.

11 голосов
/ 01 марта 2011

Использование array_diff_key():

$array = array('alpha' => 'apple', 'beta' => 'banana', 'gamma' => 'guava');

$alphaAndGamma = array_diff_key($array, array('alpha'=>0));
$onlyBeta      = array_diff_key($array, array('alpha'=>0, 'gamma'=>0));

РЕДАКТИРОВАТЬ: Я добавил => 0 с.

2 голосов
/ 01 марта 2011
$alphaAndGamma = $array;
unset($alphaAndGamma['alpha']);

$onlyBeta = $array;
unset($onlyBeta['alpha'], $onlyBeta['gamma']);
1 голос
/ 01 марта 2011

Было несколько дискуссий о скорости при использовании in_array. Из того, что я прочитал, включая этот комментарий 1 , использование isset происходит быстрее, чем in_array.

В этом случае ваш код будет:

function arrayExclude($array, array $excludeKeys){

    $return = [];

    foreach($array as $key => $value){
        if(!isset($excludeKeys[$key])){
            $return[$key] = $value;
        }
    }
    return $return;
}

Это будет немного быстрее и может помочь в случае, если вам нужно обрабатывать большие наборы данных.

0 голосов
/ 01 марта 2011

array_diff_assoc может помочь.То есть вы можете использовать

$onlyBeta = array_diff_assoc($array, array('alpha', 'gamma'))
0 голосов
/ 01 марта 2011

Вы можете легко удалить элемент массива по его ключу, используя это ..

unset($array['key']); 

DEMO http://codepad.org/EA9vTwzR

...