所以我拥有在db中作为字符串保存的医疗许可证。 我需要一种方法来单独显示许可证字母(前缀)和号码。
前缀数组是预先定义的:
$license_letters = array('20A', 'A', 'C', 'CNM', 'G', 'NP', 'PA');
许可证看起来像20A345000,C11006,G678999,PA200200等。 所以我需要能够获得'20A'和'345000'或'C'和'11006'作为任何许可。
按第一个数字搜索将无效,因为其中一个可能的前缀是20A。 我很确定必须有一个简单的解决方案,但我无法想到它。 会有任何帮助。
答案 0 :(得分:2)
如果没有许可证字符串是其中任何一个的一部分(列表中没有“A”和“AB”),那么只需循环查找第一个匹配项,如下所示:
function parts($licenseString) {
$foreach($license_letters AS $prefix) {
if(strpos($licenseString, $prefix) === 0) {
return [$prefix, substr($licenseString, strlen($prefix)];
}
}
}
编辑:我打算在比较中使用===。当没有找到匹配时,strpos返回'false',我们想要在零位置匹配,因此我们正在寻找一个特别是0(类型号)的返回值。感谢评论者指出这一点。
答案 1 :(得分:0)
您可能希望按照其中的字符串值的长度对前缀数组进行排序,以避免具有多字符前缀的情况(例如“20A”)与单字符前缀混淆(例如“A”) ):
/**
* Compare two string values
*
* @param $value1 string 1st value to compare
* @param $value2 string 2nd value to compare
*
* @return bool true if the second string is longer than the first
*/
function compareStringLength($value1, $value2)
{
return (strlen($value1) < strlen($value2));
}
/**
* Parse a license string
*
* @param $license string
* @param $licensePrefixes array of license prefixes
*
* @return array [prefix,license without prefix]
*/
function parseLicense($license, $licensePrefixes)
{
//The limit to number of times the license prefix will be replaced
$limit = 1;
foreach ($licensePrefixes AS $prefix) {
if (strpos($license, $prefix) !== false) {
$license = str_replace($prefix, "", $license, $limit);
return array($prefix, $license);
}
}
}
$licensePrefixesArray = array('20A', 'A', 'C', 'CNM', 'G', 'NP', 'PA');
/*
Sort the array to prevent confusion with multi-character prefixes (for example '20A')
and single character prefixes (for example 'A')
*/
usort($licensePrefixesArray, "compareStringLength");
print_r(parseLicense("20A345000", $licensePrefixesArray));
print_r(parseLicense("PA200200", $licensePrefixesArray));
print_r(parseLicense("A2533226", $licensePrefixesArray));