提问人:Pekka 提问时间:3/9/2010 最后编辑:mickmackusaPekka 更新时间:12/4/2022 访问量:2861
按前缀过滤数组的本机函数
Native function to filter array by prefix
问:
假设我有一个包含以下成员的数组:
car_porsche
car_mercedes
car_toyota
motorcycle_suzuki
motorcycle_honda
motorcycle_motoguzzi
我怎样才能得到一个包含所有元素的数组?有一个本机函数,但我忘记了它的名字。car_
你知道我指的是哪个功能吗?我知道如何使用 for/foreach/array_filter 做到这一点。我很确定有一个功能可以做到这一点。
答:
好吧,你可以使用 preg_grep()
:
$output = preg_grep('!^car_!', $array);
您也可以使用 array_filter(),
但您必须将测试函数传递给其中。
我认为您可以使用 array_filter() 来实现此目的。
您可以编写一个简单的例程,该例程为您提供了在返回的数组中删除前缀的选项:
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;
}
正则表达式需要更多的时间来处理,在这种情况下最好使用 strpos():
foreach($arr AS $key => $val)
if(strpos(" ".$val, "car_") == 1)
$cars[$key] = $val;
这也适用于按键:
PHP 8 (2021):
我用于此目的。str_starts_with
执行区分大小写的检查,指示大海捞针是否以针开头。
str_starts_with("car_porsche", "car_");
假设搜索针是用户提供的值,在正则表达式中使用它之前,应传递它以确保任何具有特殊含义的字符都被转义。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()
0
0
false
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; });
}
评论