首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PHP提取比较运算符

PHP提取比较运算符
EN

Stack Overflow用户
提问于 2017-10-22 14:58:24
回答 2查看 73关注 0票数 1

在一次采访中,我被问到提取两个语句之间比较运算符的最快方法是什么。

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

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

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

代码语言:javascript
运行
复制
  function extractcomp($str)
    {
       $temp = [];
       $matches = array('>','<','!','=');
       foreach($matches as $match)
       {
           if(strpos($str,$match)!== false)
            {

               $temp[] = $match; 
            }
       }

       return implode('',$temp);

    }

有谁有更好的办法吗?

EN

回答 2

Stack Overflow用户

发布于 2017-10-22 16:41:55

你可以一个字符一个字符地读,一旦你命中第一个字符,你就可以确定下一个字符是什么,即:

代码语言:javascript
运行
复制
$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;

因此,如果第一个搜索字符是">“,你只能假设第二个搜索字符是"=”,否则它就不存在。所以你得到第一个字符的索引并递增它,然后检查第二个字符是否存在于我们的搜索数组中。然后返回值。这将循环,直到它找到第一个匹配项,然后中断。

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

代码语言:javascript
运行
复制
$str = "rate!=4";
$arr = array_intersect(str_split($str), ['>','<','=','!']);
echo current($arr).(end($arr) ? end($arr) : '');

虽然速度不如循环快,但绝对可以减少代码的膨胀。

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

票数 2
EN

Stack Overflow用户

发布于 2017-10-22 15:21:32

除非他们在这个自定义函数上有一些令人不快的字符串,否则我建议使用带有范围字符掩码的trim()。像echo trim('rate>=4',"A..Za..z0..9");这样的东西可以在大约一半的时间内处理您的样本输入。

代码:(Demo)

代码语言:javascript
运行
复制
function extractcomp($str){
    return trim($str,"A..Za..z0..9");
}
echo extractcomp("rate>=4");

关于正则表达式,在preg_match()的步数方面,更好的效率是使用字符类来匹配运算符。

假设只使用有效的运算符,您可以使用/[><!=]+/,或者如果您想要收紧长度/[><!=]{1,3}/

在你的示例输入字符串上只有8个步骤。Demo

这比Andreas的基于|的模式不那么严格,但需要的步骤更少。

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46871352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档