在一次采访中,我被问到提取两个语句之间比较运算符的最快方法是什么。
例如,rate>=4
比较运算符为'>=‘,它应该能够提取'>','<','!=','=','<=','>=','='
该函数必须返回比较运算符。
这是我写的,他们把它标记为错误的。
function extractcomp($str)
{
$temp = [];
$matches = array('>','<','!','=');
foreach($matches as $match)
{
if(strpos($str,$match)!== false)
{
$temp[] = $match;
}
}
return implode('',$temp);
}
有谁有更好的办法吗?
发布于 2017-10-22 16:41:55
你可以一个字符一个字符地读,一旦你命中第一个字符,你就可以确定下一个字符是什么,即:
$ops = ['>','<','!','='];
$str = "rate!=4";
foreach($ops as $op)
{
if(($c1 = strpos($str, $op)) !== false)
{
$c2 = $str[$c1++] . (($str[$c1] == $ops[3]) ? $str[$c1] : "");
break;
}
}
echo $c2;
因此,如果第一个搜索字符是">“,你只能假设第二个搜索字符是"=”,否则它就不存在。所以你得到第一个字符的索引并递增它,然后检查第二个字符是否存在于我们的搜索数组中。然后返回值。这将循环,直到它找到第一个匹配项,然后中断。
编辑:这是另一个解决方案:
$str = "rate!=4";
$arr = array_intersect(str_split($str), ['>','<','=','!']);
echo current($arr).(end($arr) ? end($arr) : '');
虽然速度不如循环快,但绝对可以减少代码的膨胀。
总是有更好的方法来优化代码。
发布于 2017-10-22 15:21:32
除非他们在这个自定义函数上有一些令人不快的字符串,否则我建议使用带有范围字符掩码的trim()。像echo trim('rate>=4',"A..Za..z0..9");
这样的东西可以在大约一半的时间内处理您的样本输入。
代码:(Demo)
function extractcomp($str){
return trim($str,"A..Za..z0..9");
}
echo extractcomp("rate>=4");
关于正则表达式,在preg_match()
的步数方面,更好的效率是使用字符类来匹配运算符。
假设只使用有效的运算符,您可以使用/[><!=]+/
,或者如果您想要收紧长度/[><!=]{1,3}/
在你的示例输入字符串上只有8个步骤。Demo
这比Andreas的基于|
的模式不那么严格,但需要的步骤更少。
这取决于模式必须有多严格。我的模式将与!==
匹配。
如果您希望改进循环方法,请在匹配完整个比较运算符后编写一个break
。
实际上,您正在循环运算符。这将是他们(或他们中的一个)的问题。您的方法将与==
不匹配。我不确定这是否是一个可能的比较(它不在您的列表中)。
https://stackoverflow.com/questions/46871352
复制相似问题