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