取消以预定前缀开头的多个索引

时间:2016-07-29 15:57:44

标签: php arrays array-unset

我有一个如下所示的数组:

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 个答案:

答案 0 :(得分: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_USE_KEY选项的array_filter(PHP 5.6+中提供)将会很多更快(在我的测试中3-5倍)。

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

答案 1 :(得分: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