根据部分字符串选择数组键

问题描述 投票:0回答:8

我有一个数组,在该数组中我有一个数组键,看起来像,

show_me_160
这个数组键可能会稍微改变,所以有时页面可能会加载并且数组键可能
show_me_120
,我现在想要是可能的仅字符串匹配数组键直到最后一个
_
,以便我可以检查最后一个下划线之后的值是什么?

php arrays string substring strpos
8个回答
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...
  }
}

27
投票

我最近遇到了类似的问题。这就是我想到的:

$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, '_'));
  }
}

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


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
);

如果您要搜索两者,则必须将 2 个参数传递给回调函数


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";
        }
}

0
投票

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

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


0
投票

确认找到符合条件的键并提取数字后缀只需在循环内调用

sscanf()
(而不是两个或三个函数调用)即可实现。甚至可以通过在格式参数中使用
%d
将数字后缀转换为整数。

当找到所寻找的键时,打破循环,因为不再有搜索的意义。其他使用

array_filter()
preg_grep()
的脚本将不必要地且次优地迭代整个数组 - 即使在遇到所查找的键之后也是如此。

代码:(演示

$array = [
    'foo' => 1,
    'show_me_120' => 'something',
    'bar' => 42,
];
$showMeNumber = null;
foreach ($array as $k => $v) {
    if (sscanf($k, 'show_me_%d',$showMeNumber)) {
        break;
    }
}
var_export($showMeNumber);
// 120

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

更多信息(示例):

如果数组键包含“show_me_”

$示例=爆炸('show_me_','show_me_120');

print_r($示例)

Array ( [0] => [1] => 120 ) 

print_r(计数($示例))

2 

print_r($example[1])

 120 
© www.soinside.com 2019 - 2024. All rights reserved.