PHP提取比较运算符

时间:2017-10-22 06:58:24

标签: php

在接受采访时我被问到在两个陈述之间提取比较运算符的最快方法。

例如rate>=4比较运算符为'&gt; ='它应该能够提取'>','<','!=','=','<=','>=','='

该函数必须返回比较运算符。

这是我写的,他们把它标记为错误。

  function extractcomp($str)
    {
       $temp = [];
       $matches = array('>','<','!','=');
       foreach($matches as $match)
       {
           if(strpos($str,$match)!== false)
            {

               $temp[] = $match; 
            }
       }

       return implode('',$temp);

    }

有没有人有更好的方法?

2 个答案:

答案 0 :(得分:2)

你可以在第一次出现时逐字逐句地阅读,你可以确定它将成为下一个字符,即:

$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;

因此,如果第一个搜索字符是&#34;&gt;&#34;你只能假设第二个将是&#34; =&#34;或者它不存在。因此,您获得第一个字符的索引并递增它,并检查我们的搜索数组中是否存在第二个字符。然后返回值。这将循环,直到找到第一次出现然后中断。

编辑: 这是另一个解决方案:

$str = "rate!=4";
$arr = array_intersect(str_split($str), ['>','<','=','!']);
echo current($arr).(end($arr) ? end($arr) : '');

不如循环快,但肯定会减少膨胀代码。

总是有更好的方法来优化代码。

答案 1 :(得分:1)

除非他们在这个自定义函数中使用一些猴子字符串,否则我建议使用带有远程字符掩码的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&#39;基于|的模式,但步骤较少。

这取决于模式必须有多严格。我的模式将匹配!==

如果您想改进循环方法,请在匹配整个比较运算符后编写break

实际上,您正在循环运算符。这可能是他们的问题(或其中之一)。您的方法与==不匹配。我不确定这是否是可能的比较(它不在您的列表中)。