【问题标题】:How Can I Speed Up This PHP Function?如何加速这个 PHP 函数?
【发布时间】:2016-03-12 13:45:01
【问题描述】:

我正在为我的网页制作一个 php 过滤器,该过滤器检查一个数组,读取一个文件,以查看多个用户输入字段(名称、描述等)是否包含数组中的任何单词。我尝试使用 php 内置的“strpos”函数,但无论出于何种原因,它只检测到该词是否是字符串中的最后一个词,即如果我正在检查“cat”这个词,它会检测到它是否是检查“this is a cat”和“scat”,但不检查“cats”或“cat toy”,甚至只是“cat”后面有一个空格。为了清楚起见,我确实检查了 strpos 函数是否不等于 false (strpos(...)!==false)。所以我创建了自己的函数,将字符串分解为每个可能的子字符串,并检查每个子字符串是否等于数组中的任何单词。有没有更快的方法可以做到这一点,或者我可以加快代码的执行速度?代码如下:

function arrayContains($string, array $array){
$string = strtolower($string);
$len=strlen($string);
 foreach($array as $check){
    for($i=0; $i<$len; $i++){
        for($j=1; $j<=$len-$i; $j++){
            $sub=substr($string,$i,$j);
            if($sub==$check)
                return true;
        }
}
}
return false;
 }

【问题讨论】:

  • 也许你可以反过来使用in_array()
  • 我刚刚尝试过,它的速度呈指数级增长。非常感谢!
  • 能否请您详细说明一下strpos问题?我有一种感觉,您没有区分返回 0 和布尔值 false 的函数。如果您在“cats”或“cats”中搜索“cat”并带有空格,它将返回 0,因为可数集从位置 0 开始,而不是 1。如果您只是在执行“if (strpos()) { condition true } " 0 被强制转换为 false,所以它不起作用。您需要严格的相等性检查,即“if strpos(...) !== false...”
  • @carsond2704 - 如果您找到了解决方案,可以将其添加为您自己问题的答案
  • @KaloyanDoichinov 我的 if 语句说“if (strpos(...)!==false)”

标签: php string function loops contains


【解决方案1】:

我怀疑你可能误用了strpos();要么以错误的顺序放置参数,要么不检查真正的布尔结果。这应该有效:

function foundInArray($string, $array){
    $string = strtolower($string);
    foreach($array as $check){
        if (strpos($string, strtolower($check)) !== false) {
            return true;
        }
    }
    return false;
}

编辑以添加结果:

php > $array = ["foo", "bar", "baz"];
php > $string = "Cheese is a food I like";
php > var_dump(foundInArray($string, $array));
bool(true)
php > $string = "Cheese is a thing I like";
php > var_dump(foundInArray($string, $array));
bool(false)

【讨论】:

    【解决方案2】:

    @developerwjk 建议的这个答案帮助解决了我的问题。我仍然愿意接受更多建议,但如果有的话。 function arrayContains($string, array $array){ $string = strtolower($string); $len=strlen($string); for($i=0; $i<$len; $i++){ for($j=1; $j<=$len-$i; $j++){ $sub=substr($string,$i,$j); if(in_array($sub, $array)) return true; } } return false; }

    【讨论】:

      猜你喜欢
      • 2021-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-13
      • 2013-05-11
      相关资源
      最近更新 更多