2016-07-29 2 views
2

У меня есть массив, который выглядит следующим образом:несколько индексов Сброс переменных, начиная с заранее определенным префиксом

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

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

+1

Для уверенности, что префикс является "game.info.campaign"? –

+0

Является ли этот синтаксис инициализатора 'Array() действительным со всеми квадратными скобками? Или это псевдокод-иш? –

+0

извините, это псевдокод-иш. – dms

ответ

1

Это должно работать для заданного префикса. Просто 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); 
+0

Убей меня на шесть секунд =) –

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() и сбрасывает их.

См. live demo.

Смежные вопросы