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

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

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']);
}

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

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-5X в моих тестах).

$new = array_filter($array, function ($key) use ($prefix) {
return strpos($key, $prefix) !== 0;
}, ARRAY_FILTER_USE_KEY);
1

Другие решения

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

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

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

См живое демо.

1