Сброс нескольких индексов, начинающихся с заданного префикса

У меня есть массив, который выглядит так:

Array ( [game.info.campaign.end_date] => 2016-07-31, [game.info.campaign.start_date] => 2016-07-11, [game.info.campaign.peak_date] => 2016-07-21, [game.info.campaign.promo] => 'pokemon_go' );

Я хотел бы отключить их все в несколько строк, не повторяя код. Есть ли способ сделать это в PHP?

if (array_key_exists('game.info.campaign.end_date', $result)) {
    unset($result['game.info.campaign.end_date']);
}

Я делаю это прямо сейчас, но слишком много повторений, а некоторые массивы имеют тысячи записей, начинающихся с одного и того же префикса.


person dms    schedule 29.07.2016    source источник
comment
На всякий случай префикс game.info.campaign?   -  person Don't Panic    schedule 29.07.2016
comment
Является ли этот синтаксис инициализатора Array() действительным со всеми квадратными скобками? Или это псевдокод?   -  person Jonathan Lam    schedule 29.07.2016
comment
извините, это псевдокод.   -  person dms    schedule 29.07.2016
comment
@ajax Если вам помог один из приведенных ниже ответов, обязательно отметьте его как принятый, чтобы показать сообществу, что он сработал. Спасибо!   -  person Jonathan Lam    schedule 29.07.2016


Ответы (2)


Это должно работать для данного префикса. Просто foreach над массивом и снимите ключи, начинающиеся с $prefix.

$prefix = 'game.info.campaign';
$l = strlen($prefix);

foreach ($array as $key => $value) {
    if (substr($key, 0, $l) == $prefix) {
        unset($array[$key]);
    }
}

Или, если вы не возражаете против создания нового массива вместо сброса ключей в исходном массиве, используйте array_filter с параметром ARRAY_FILTER_USE_KEY (доступно в PHP 5.6+) будет намного быстрее (в моих тестах в 3-5 раз).

$new = array_filter($array, function ($key) use ($prefix) {
    return strpos($key, $prefix) !== 0;
}, ARRAY_FILTER_USE_KEY);
person Don't Panic    schedule 29.07.2016
comment
Опередил меня на шесть секунд =) - person Jonathan Lam; 29.07.2016

Если префикс равен game.info.campaign, вы можете перебрать их и удалить те, у которых есть совпадающие ключи:

foreach($result as $key => $val)
    if(strpos($key, "game.info.campaign") === 0)
        unset($result[$key]);

Это проверяет, начинается ли $key с "game.info.campaign", используя PHP strpos(), и отключает их.

См. демонстрацию.

person Jonathan Lam    schedule 29.07.2016