-2

我有一个菜单,根据语言有条件地显示。

它看起来像这样:

if (
$page == "page1.htm" ||
$page == "page2.htm" ||
$page == "page3.htm" ||
etc couple 100 of those
) {
//output menu
}

我在一个 if 中有几百个这样的或语句。

这会显着影响性能吗?

我对可维护性不感兴趣,而只对性能感兴趣。我想知道是否值得优化。

4

5 回答 5

5

每当您发现自己||在语句中使用了很多if,那么您可能最好使用in_array()

$validPages = Array("page1.htm", "page2,htm", "page3.htm");
if(in_array($page, $validPages)){
    //Output menu
}
于 2013-06-11T08:29:43.027 回答
4

我会为此使用 RegExp,您也可以根据自己的需要进行编辑:

if (preg_match("/^page[0-9]{1,3}\.htm$/", $page)){
  //Execute if this is a page.
}

在我看来,最好创建某种复杂的模式/几个模式来检查,因为它:

  • 可能会提高性能
  • 将保持您的代码干净(这是最重要的)
于 2013-06-11T08:31:10.597 回答
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,或者太多的../..位和螺栓......永远不要相信网络 :)

于 2013-06-11T08:32:38.603 回答
0

正如 F4r-20 所提到的,使用in_array()是一个好主意。此外,如果您确定页面将被命名为page1.htmpage2.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 个条件

于 2013-06-11T08:40:34.587 回答
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;
}
于 2013-06-11T08:54:15.007 回答