PHP-将字符串的第一个字符与数组值和返回键匹配

PHP-将字符串的第一个字符与数组值和返回键匹配,php,regex,Php,Regex,我有大量的数据 0134234XXX 0255234XXX 0843324XXX 080054XXXX 001342343XX 07800XXXXXX 003342343XX 和一个数组:(Key=>Val) 我正在尝试编写一个函数,它将返回匹配的第一个字符的键 例如: 此处不需要正则表达式: $findKey = function($str) use ($values) { foreach ($values as $k => $v) if (strpos($st

我有大量的数据

0134234XXX
0255234XXX
0843324XXX
080054XXXX
001342343XX
07800XXXXXX
003342343XX
和一个数组:(Key=>Val)

我正在尝试编写一个函数,它将返回匹配的第一个字符的键 例如:


此处不需要正则表达式:

$findKey = function($str) use ($values) {
    foreach ($values as $k => $v)
        if (strpos($str, $v) === 0) return $k;
    return false;
};

我认为OP不需要匿名函数,因为它很可能在数组元素上重复使用

这是revo方法的一个效率稍低的版本,当一个搜索数组值作为另一个值的前导字符存在时,该方法将搜索最长的匹配。()


我正在努力。。那就展示你试过的我试着写点东西但是。。。
0255234XXX
的预期结果是什么?输入数组
数组('01'、'001'、'07'、'0845')
?是否功能化为?@chris85:如果数组
$values=['01'、'011'、'0845'、'001'],则该功能无效
并且字符串是
011000
。如果数组是
$values=['01','011','0845','001',它将不起作用
并且字符串是
011000
。你的代码会说
0
,而它应该是
1
,不是吗?为什么你认为它应该是
1
?@ChrisKerrison revo的方法是最短、最有效的方法(尽管你可能不想要匿名函数)。如Wiktor所说,如果一个值有可能代表另一个值的开始,那么只需确保在数组中先排序较长的值,再排序较短的值即可。
$keyNumber = findkey('001342343XX');

$keyNumber = 2
$findKey = function($str) use ($values) {
    foreach ($values as $k => $v)
        if (strpos($str, $v) === 0) return $k;
    return false;
};
$tin_foil_hat="on";  // <-- essential for this method ;)

function findkey($haystack,$needles){
    $match=0; // "No Match";
    foreach($needles as $k=>$v){
        if(strpos($haystack,$v)===0){
            $match=$k;  // overwrite any shorter previous matches
        }
    }
    return $match;
}

$haystacks=['0134234XXX','0255234XXX','0843324XXX','080054XXXX','001342343XX','07800XXXXXX','003342343XX'];
$haystacks[]='0110000XXX'; // for Wiktor
$needles=[1=>'01',2=>'001',3=>'07',4=>'0845'];
$needles[5]='011'; // for Wiktor
// This assumes shorter string contained in a larger string will be ordered first in $needles array.
// If no needles value is contained in another needles value, then revo's is the way to go (with early return).

foreach($haystacks as $haystack){
     echo $haystack,' => ',findkey($haystack,$needles),"\n";
}
0134234XXX => 1
0255234XXX => 0
0843324XXX => 0
080054XXXX => 0
001342343XX => 2
07800XXXXXX => 3
003342343XX => 0
0110000XXX => 5