基于部分字符串选择数组键

45

我有一个数组,其中有一个数组键,看起来像show_me_160,这个数组键可能会稍微改变,所以有时页面加载时,数组键可能是show_me_120,现在我想知道是否可能只匹配数组键直到最后一个_,以便我可以检查最后一个下划线后面的值?


你能举个例子吗? - Gumbo
1
使用array_map和回调函数来对preg_match进行匹配#show_me_([\d])+# - Hannes
我已经投票将此问题标记为“不清楚”。没有示例数组,没有期望输出,没有编码尝试,也没有对符合条件的关键字尾部进行清晰的解释。我不知道是否有多个关键字符合条件。我们这里缺少一个最小化、完整化、可重现化的示例。 - mickmackusa
7个回答

34

我能想到一种解决方案:

foreach($myarray as $key=>$value){
  if("show_me_" == substr($key,0,8)){
    $number = substr($key,strrpos($key,'_'));
    // do whatever you need to with $number...
  }
}

4
我考虑过在我的工作中使用这个,但我怀疑它在处理巨大数组时会非常缓慢。 - GordonM

26

我最近也遇到了类似的问题。这是我的解决方案:

$value = $my_array[current(preg_grep('/^show_me_/', array_keys($my_array)))];

9

如果您没有直接查询数组的可能性(我假设数组还包含完全不相关的键,但如果不是这种情况,可以跳过 if 部分),则必须迭代数组以单独检查每个键:

foreach($array as $k => $v)
{
  if (strpos($k, 'show_me_') !== false)
  {
    $number = substr($k, strrpos($k, '_'));
  }
}

然而,这听起来像是一种非常奇怪的存储数据的方式,如果我是你,我会检查是否有另一种(更高效)的方法在应用程序中传递数据。 ;)


这在我的情况下可行,但请注意这一行代码:if (strpos($k, 'show_me_') !== false) 应该是 if (strpos($v, 'show_me_') !== false) - freestate
1
最好使用 0 === strpos($k, 'show_me_') 来确保只有前缀匹配,而像 noshow_me_ 这样的值不会匹配。 - Will B.

9

要在数组键中搜索特定字符串,可以使用array_filter();查看文档

// the array you'll search in
$array = ["search_1"=>"value1","search_2"=>"value2","not_search"=>"value3"];
// filter the array and assign the returned array to variable
$foo = array_filter(
    // the array you wanna search in
    $array, 
    // callback function to search for certain sting
    function ($key){ 
        return(strpos($key,'search_') !== false);
    }, 
    // flag to let the array_filter(); know that you deal with array keys
    ARRAY_FILTER_USE_KEY
);
// print out the returned array
print_r($foo);

如果你要在数组中搜索值,可以使用标志0或将标志留空。

$foo = array_filter(
    // the array you wanna search in
    $array, 
    // callback function to search for certain sting
    function ($value){ 
        return(strpos($value,'value') !== false);
    }, 
    // flag to let the array_filter(); know that you deal with array value
    0
);

或者

$foo = array_filter(
    // the array you wanna search in
    $array, 
    // callback function to search for certain sting
    function ($value){ 
        return(strpos($value,'value') !== false);
    }
);

如果您需要在数组的值和键中搜索,则可以使用标志ARRAY_FILTER_USE_BOTH。

$foo = array_filter(
    // the array you wanna search in
    $array, 
    // callback function to search for certain sting
    function ($value, $key){ 
        return(strpos($key,'search_') !== false or strpos($value,'value') !== false);
    },
    ARRAY_FILTER_USE_BOTH
);

如果您想同时搜索两者,则需要向回调函数传递两个参数。


如果我想在逻辑结尾返回字符串值怎么办?因为目前这个函数返回的是一个包含键和值的数组。 - DarkteK

4
您也可以使用基于preg_match的解决方案:
foreach($array as $str) {
        if(preg_match('/^show_me_(\d+)$/',$str,$m)) {
                echo "Array element ",$str," matched and number = ",$m[1],"\n";
        }
}

你甚至可以使用\K来避免捕获组。 - mickmackusa

0

filter_array($array, function ($var){return(strpos($var,'searched_word')!==FALSE);},);

返回数组 'searched_key' => '分配给键的值'


2
一份没有上下文的未格式化代码块通常不是一个好的答案。也许您可以[编辑]答案,清楚地说明您在建议什么以及为什么认为它回答了问题。 - user1531971
开发人员如何知道这两个变量:“searched_key”和“分配给键的值”?此外,此响应格式不正确。 - DarkteK

-1
 foreach($myarray as $key=>$value)
    if(count(explode('show_me_',$event_key)) > 1){
         //if array key contains show_me_
    }

更多信息(示例):
如果数组键包含“show_me_” $example = explode('show_me_','show_me_120'); print_r($example)
Array ( [0] => [1] => 120 ) 

打印(count($example))

2 

print_r($example[1])

 120 

你能否详细解释一下这段代码的含义? - Moon Cheesez
如果数组键包含'show_me_'$example = explode('show_me_', 'show_me_120');$example是: Array ( [0] => [1] => 120 )count($example)是: 2$example[1]是: 120 - devugur
如果可以使用substring或strpos,为什么需要两个函数(explode和count)呢? - Vinicius Monteiro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接