我读过这篇文章: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倍。
答案 0 :(得分:1)
由于您在两种情况下都在爆炸,您可能会考虑只是爆炸到一个键值对,并在您正在寻找的键上进行简单的设置。我不能说性能会是什么,如果没有查看PHP源代码,我会说in_array可能会做它自己的foreach。
只需考虑一个链接: