php 从特定子字符串开始的键中获取数字后缀

tp5buhyn  于 11个月前  发布在  PHP
关注(0)|答案(8)|浏览(135)

我有一个数组,在这个数组中,我有一个数组键,看起来像,show_me_160这个数组键可能会改变一点,所以有时页面可能会加载,数组键可能是show_me_120,我想现在可以只是字符串匹配数组键,直到最后一个_,这样我就可以检查最后一个下划线后面的值是什么?

qlfbtfca

qlfbtfca1#

我能想到的一个解决办法是:

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

字符串

tkqqtvp1

tkqqtvp12#

您可以将整个数组的键隔离为一个新数组,然后使用正则表达式过滤整个新数组,只保留以show_me_开头的值,然后访问第一个合格键持有的原始数组值。

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

字符串

5cnsuln7

5cnsuln73#

你必须遍历你的数组来分别检查每个键,因为你不可能直接查询数组(我假设数组也包含完全不相关的键,但如果不是这样,你可以跳过if部分):

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

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

lf5gs5x2

lf5gs5x24#

要在数组键中搜索特定字符串,可以使用array_filter();see docs

// 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个参数

rkkpypqq

rkkpypqq5#

您也可以使用基于preg_match的解决方案:

foreach($array as $str) {
        if(preg_match('/^show_me_(\d+)$/',$str,$m)) {
                echo "Array element ",$str," matched and number = ",$m[1],"\n";
        }
}

字符串

gcuhipw9

gcuhipw96#

只需要在一个循环中调用sscanf()(而不是两个或三个函数调用),就可以证明找到了限定键并提取数字后缀。甚至可以通过在格式参数中使用%d将数字后缀转换为整数。
当找到所寻找的键时,中断循环,因为不再有点搜索了。其他使用array_filter()preg_grep()或未中断的foreach()的脚本将不必要地、次优地遍历整个数组--即使在遇到所寻找的键之后。
产品编号:(Demo

$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

字符串

kulphzqa

kulphzqa7#

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 )


print_r(count($example))

2


print_r($example[1])

120

0dxa2lsx

0dxa2lsx8#

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

return array 'searched_key' => 'value assigned to the key'

字符串

相关问题