按前缀过滤数组的本机函数

Native function to filter array by prefix

提问人:Pekka 提问时间:3/9/2010 最后编辑:mickmackusaPekka 更新时间:12/4/2022 访问量:2861

问:

假设我有一个包含以下成员的数组:

car_porsche
car_mercedes
car_toyota
motorcycle_suzuki
motorcycle_honda
motorcycle_motoguzzi

我怎样才能得到一个包含所有元素的数组?有一个本机函数,但我忘记了它的名字。car_

你知道我指的是哪个功能吗?我知道如何使用 for/foreach/array_filter 做到这一点。我很确定有一个功能可以做到这一点。

PHP 数组 过滤 前缀 preg-grep

评论


答:

7赞 cletus 3/9/2010 #1

好吧,你可以使用 preg_grep()

$output = preg_grep('!^car_!', $array);

您也可以使用 array_filter(),但您必须将测试函数传递给其中。

-1赞 casraf 3/9/2010 #2

我认为您可以使用 array_filter() 来实现此目的。

1赞 Pete B 4/16/2010 #3

您可以编写一个简单的例程,该例程为您提供了在返回的数组中删除前缀的选项:

function filter_by_key_prefix ( $arr, $prefix, $drop_prefix=false ) {
        $params = array();
        foreach( $arr as $k=>$v ) {
            if ( strpos( $k, $prefix ) === 0 ) {
                if ( $drop_prefix ) {
                    $k = substr( $k, strlen( $prefix ) );
                }
                $params[ $k ] = $v;
            }
        }
        return $params;
    }
2赞 InVeX 6/26/2011 #4

正则表达式需要更多的时间来处理,在这种情况下最好使用 strpos():

foreach($arr AS $key => $val)
if(strpos(" ".$val, "car_") == 1)     
    $cars[$key] = $val;

这也适用于按键:

0赞 ixany 10/5/2021 #5

PHP 8 (2021):

我用于此目的。str_starts_with

执行区分大小写的检查,指示大海捞针是否以开头。

→文档

str_starts_with("car_porsche", "car_");
0赞 mickmackusa 12/1/2022 #6

假设搜索针是用户提供的值,在正则表达式中使用它之前,应传递它以确保任何具有特殊含义的字符都被转义。preg_quote()

使用函数提供了最深入的工具,例如不区分大小写、多字节解析和单词边界......如果可取。preg_

反转过滤只需使用功能标志即可。若要使用非正则表达式函数反转过滤,只需反转返回值或对返回值进行比较(取决于您使用的技术。preg_grep()

代码(演示)

function keepIfStartsWith_regex($haystack, $needle) {
    return preg_grep('/^' . preg_quote($needle, '/') . '/', $haystack);
}

function removeIfStartsWith_regex($haystack, $needle) {
    return preg_grep('/^' . preg_quote($needle, '/') . '/', $haystack, PREG_GREP_INVERT);
}

为了区分大小写匹配 PHP8 中字符串的前导字符,请使用简洁直观函数的迭代调用。str_starts_with()

function keepIfStartsWith_PHP8($haystack, $needle) {
    return array_filter($haystack, fn($v) => str_starts_with($v, $needle));
}

function removeIfStartsWith_PHP8($haystack, $needle) {
    return array_filter($haystack, fn($v) => !str_starts_with($v, $needle));
}

对于低于 8 的 PHP 版本,您可以对区分大小写或不区分大小写的匹配进行迭代调用。您必须显式检查返回值是否相同,因为执行松散比较(类型杂耍比较)会误认为找不到匹配项。strpos()stripos()00false

function keepIfStartsWith_PHP7_4($haystack, $needle) {
    return array_filter($haystack, fn($v) => strpos($v, $needle) === 0);
}

function removeIfStartsWith_PHP7_4($haystack, $needle) {
    return array_filter($haystack, fn($v) => strpos($v, $needle) !== 0);
}

function keepIfStartsWith_sub7_4($haystack, $needle) {
    return array_filter($haystack, function($v) use($needle) { return strpos($v, $needle) === 0; });
}

function removeIfStartsWith_sub7_4($haystack, $needle) {
    return array_filter($haystack, function($v) use($needle) { return strpos($v, $needle) !== 0; });
}