【问题标题】:Multiple if/else statements vs foreach loop多个 if/else 语句与 foreach 循环
【发布时间】:2014-02-11 18:29:31
【问题描述】:

我只是想弄清楚从长远来看哪个会更好,以及这两种方案之间是否存在性能差异。

我们正在维护一个由我们创建的网站,我们正在尝试向某些页面的侧边栏动态添加一些内容,并尝试确定是否有理由使用 foreach 循环或多个 if/else 语句。

我们最终会得到比此处显示的 6 个页面多很多的页面,因此可能会考虑性能问题。

foreach 循环如下所示:

$rb_enabled = false;

$RURLs = array(
    '/cambridge.php' => 'cambridge',
    '/milton.php' => 'milton',
    '/kitchener_waterloo.php' => 'kw',
    '/hamilton_dundas.php' => 'hd',
    '/oakville.php' => 'oakville',
    '/brantford.php' => 'brantford'
);

foreach( $RURLs as $rurl => $engine_location ){
    if($_SERVER['REQUEST_URI'] == $ru){
        $rb_url == $engine_location;
        $rb_enabled == true;
    } 
}

if($rb_enabled === true){ //create a div with information based on engine location }

这个加载到的侧边栏 php 文件在很多页面上,其中一些需要专门为它创建的 div,其他页面根本不需要它,因此$rb_enabled。

foreach 循环比这更好或更差的原因是什么:

if($_SERVER['REQUEST_URI'] == '/cambridge.php'){ $rb_url = 'cambridge'; $rb_enabled = true; }
else if($_SERVER['REQUEST_URI'] == '/milton.php'){ $rb_url = 'milton'; $rb_enabled = true; }
else if($_SERVER['REQUEST_URI'] == '/kitchener_waterloo.php'){ $rb_url = 'kw'; $rb_enabled = true; }
else if($_SERVER['REQUEST_URI'] == '/hamilton_dundas.php'){ $rb_url = 'hd'; $rb_enabled = true; }
else if($_SERVER['REQUEST_URI'] == '/oakville.php'){ $rb_url = 'oakville'; $rb_enabled = true; }
else if($_SERVER['REQUEST_URI'] == '/brantford.php'){ $rb_url = 'brantford'; $rb_enabled = true; }

if 语句与$rb_enabled 相比有点多余,但想知道是否有任何理由使用一种方式而不是另一种方式,即使它只是“如果你是下一个有手的人,你宁愿接管哪个代码在这个项目上”,如果这是唯一的原因。

也完全接受一个新想法!

【问题讨论】:

    标签: php if-statement foreach


    【解决方案1】:

    您应该使用switch/case 语法来满足您的要求:

    switch( $_SERVER['REQUEST_URI'] ) {
        case '/milton.php':
           $rb_url = 'milton';
           $rb_enabled = true;
           break;
    
        ....
    }
    

    【讨论】:

    • 当没有明确定义的启发式/映射时,对于 fixed set 的这种情况,我只支持 if/switch可以应用的。 (如果只有少数特殊情况 - 即执行附加操作 - 我会单独处理它们。)
    • 我曾考虑过这一点,但它比 if/else 语句要多一些代码,而且它仍然需要循环遍历它们。虽然不是一个坏建议,但它与 if/else 大致相当。虽然 +1,但我会向其他人推荐如何使用 array_key_exists() :)
    【解决方案2】:

    您已经有一个以 URI 为键的数组,那么为什么不使用 array_key_exists()?

    if(array_key_exists($_SERVER['REQUEST_URI'], $RURLS)) {
        $rb_enabled = true;
        $rb_url = $RURLS[$_SERVER['REQUEST_URI']];
    }
    

    无需遍历数组,也无需提供多个 if 或 switch/case 语句。此查找的性能不会随着 URI 数组大小的增加而降低(至少在合理范围内 - 如果您有一个占用大量内存的巨大数组,这可能是个问题。)

    【讨论】:

    • 我相信最终数组会在合理范围内,所以我将继续使用它。谢谢,接受了!
    【解决方案3】:

    一行:

    list($rb_enabled,$rb_url) = ($url=$RURLs[$_SERVER['REQUEST_URI']])? array(true,$url) : null ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-12
      • 2015-09-15
      • 2021-12-13
      • 1970-01-01
      • 2015-10-28
      • 2020-03-20
      • 2017-02-17
      相关资源
      最近更新 更多