我有一个菜单,根据语言有条件地显示。
看起来像这样:
if (
$page == "page1.htm" ||
$page == "page2.htm" ||
$page == "page3.htm" ||
etc couple 100 of those
) {
//output menu
}
我在单个if中有一些或那些声明。
这会对性能产生重大影响吗?
我对可维护性不感兴趣,但仅对性能感兴趣。我想知道是否值得优化。
答案 0 :(得分:5)
每当您在||
语句中发现自己经常使用if
时,您可能最好使用in_array()
:
$validPages = Array("page1.htm", "page2,htm", "page3.htm");
if(in_array($page, $validPages)){
//Output menu
}
答案 1 :(得分:4)
我会使用RegExp,您也可以根据自己的需要进行编辑:
if (preg_match("/^page[0-9]{1,3}\.htm$/", $page)){
//Execute if this is a page.
}
在我看来,最好创建某种复杂模式/多种模式来检查,因为它:
答案 2 :(得分:2)
好吧,也许我最好发表评论作为答案。如果你真的不想(或不能)重新考虑你的代码:
$pages = array_fill_keys(array("page1.htm", "page2,htm", "page3.htm"), true);
if (array_key_exists($page, $pages))
{
//do whatever
}
然后,如果您正在检查客户端是否正在请求现有页面,您可以考虑使用:
if (file_exists($page))
{
require_once($page);
}
或类似的东西。当然,检查$page
变量中的/etc/httpd/httpd.conf
等值,或者../..
位和螺栓太多......永远不要相信网络:)
答案 3 :(得分:0)
如F4r-20所述,使用in_array()
是一个好主意。此外,如果您确定将页面命名为page1.htm
,page2.htm
等,则可以使用for loop
构造来执行此任务;像这样:
for($i=0; $i<$no_of_pages; $i++){
$pages[$i] = 'page'.($i+1).'.htm';
}
if(in_array($page, $pages)){
//your condition here
}
您还可以将页面存储在表格的列中,以便在需要时执行SQL查询。
关于||
运算符,它不一定检查所有条件(比如说100)。每当条件满足时,它就会停在那里并进入if语句的主体。因此,最好的情况是 1条件,最坏的情况是 100条件。
答案 4 :(得分:0)
我更喜欢这些代码:
$page="page10.htm"; //Example data
$match=array();
preg_match('/page(\d*)\.htm/', $page,$match);
$match=$match[1];
switch($x)
{
case $x>1 && $x<40:
echo "uder 50";
break;
case $x>40:
echo "upper 50";
break;
}