对于大型逗号分隔的子串,foreach或in_array更快检查?

时间:2014-01-17 19:07:30

标签: php arrays foreach

我读过这篇文章:faster than in_array?但我尝试了一部分PHP代码的实验。在我的站点的数据库中,用户已经存储了一个逗号分隔的文本子串的字符串( $ UserString )。我最初检查用户输入( $ PostedVar )是否是通过使用foreach循环爆炸 $ UserString 创建的数组的成员(我重新创建了一小部分这里的相关代码):

$PostedVar = mysqli_real_escape_string($_POST['userinput']);
$CommaCount = substr_count($UserString, ','); 
$ExplodedUserString = explode(",", $UserString);
$Break = 'nobreak';

$i = 1;  
foreach ($ExplodedUserString as $EUS) {
    $Current = $EUS;
    if ($i > $CommaCount) {
        break;
    }
    else if ($Current === $PostedVar) {
        $Break = 'break';
        break;
    }
    else {            
        $i++;
    }
}//End foreach

if ($Break === 'break') {
    echo "<script>
    alert ('You have previously selected "'.$PostedVar.'". Please try again!');
    location = 'home.php';
    </script>"        
}
else {
    echo "<script>
    alert ('Thanks for selecting "'.$PostedVar.'"!');
    location = 'home.php';
    </script>";
}

然后我将foreach与in_array进行比较,检查 $ UserString ,除了为foreach和in_array添加2个微时间语句外,完全相同:

//foreach method
$time1 = microtime();
$i = 1;  
foreach ($ExplodedUserString as $EUS) {
    $Current = $EUS;
    if ($i > $CommaCount) {
        break;
    }
    else if ($Current === $PostedVar) {
        $Break = 'break';
        break;
    }
    else {

        $i++;
    }
}//End foreach

$time2 = microtime();
$Diff = $time2 - $time1;

if ($Break === 'break') {
    echo "<script>
    alert ('$Diff');
    location = 'home.php';
    </script>"        
}
else {
    echo "<script>
    alert ('$Diff');
    location = 'home.php';
    </script>";
}

//in_array method
$time1 = microtime();
if (in_array($PostedVar, $ExplodedUserString)) {
    $Break = 'break';
}
$time2 = microtime();
$Diff = $time2 - $time1;

if ($Break === 'break') {
    echo "<script>
    alert ('$Diff');
    location = 'home.php';
    </script>"        
}
else {
    echo "<script>
    alert ('$Diff');
    location = 'home.php';
    </script>";
}

我做了9次试验,其中所有因素保持不变(点击相同的提交按钮,相同的用户,相同的 $ UserString 等),并抛出高值和低值...的意思 $ Diff 7个foreach和in_array 的试验实际上对in_array 的速度提高了12%。请记住,这是针对 $ UserString 的仅5个逗号分隔值的短字符串。特别是对于较大的字符串,in_array不会比foreach循环更快吗?我的网站的重要性在于,我预计典型的 $ UserString 值比我之前测试的 $ UserString 的字符数至少多10-20倍。

1 个答案:

答案 0 :(得分:1)

由于您在两种情况下都在爆炸,您可能会考虑只是爆炸到一个键值对,并在您正在寻找的键上进行简单的设置。我不能说性能会是什么,如果没有查看PHP源代码,我会说in_array可能会做它自己的foreach。

只需考虑一个链接:

explode() into $key=>$value pair