如何有效地检查(strpos(...))数组的所有元素?

时间:2016-09-15 13:25:31

标签: php arrays performance

我想检查一个数组的所有元素并找出它们中是否至少有一个以给定字符串作为前缀:

public function validateStringByPrefix(string $string, $prefix)
{
    $valid = false;
    if (is_string($prefix)) {
        if (strpos($string, $prefix) === 0) {
            $valid = true;
        }
    } elseif (is_array($prefix)) {
        foreach ($prefix as $partPrefix) {
            if (strpos($string, $partPrefix) === 0) {
                $valid = true;
                break;
            }
        }
    }
    return $valid;
}

是否有可能/如何以更有效的方式实现同​​样的目标?

(这是一种廉价的方法,但在我的应用程序中它被称为很多次,因此即使是最小的改进也可能会显着提高应用程序的性能。)

2 个答案:

答案 0 :(得分:1)

您可以尝试下一个解决方案:

public function validateStringByPrefix(string $string, $prefix)
{
    return (bool)array_filter((array)$prefix, function($prefix) use ($string) {
        return strpos($string, $prefix)===0;
    });
}

P.S。如果你有很少的大型数组(有前缀),我的解决方案效率较低,你可以像我这样结合我们的方法:

public function validateStringByPrefix(string $string, $prefix)
{
    if($string=='') {
        return false;
    }
    foreach ((array)$prefix AS $subprefix) {
        if (strpos($string, $subprefix)===0) {
            return true;
        }
    }
    return false;
}

答案 1 :(得分:-1)

罗马有很多方法......

//your array to test for
$array=[];
//set valid to false
$valid=false;
//setup prefixes array or not
$prefix='whatever';
//make array if you dont have one
!is_array($prefix) AND $prefix=array($prefix);
//prepare for use as REGEX
$prefix=implode('|',$prefix);
//do the work
array_walk($array,function($val,$key) use(&$valid,$prefix){
       if (!$valid && preg_match("#^($prefix)#",$key)) {
            $valid = true;
       }
});
var_export($valid);

我在这里使用preg_match,因为$prefix可以是一个数组,所以数学将是:n+ strpos() callsone preg_match() call

在单个项目匹配后,不再调用preg_match,只是迭代到最后和结束。