【问题标题】:Can any one give me some advice to make my for loop more efficient?谁能给我一些建议以使我的 for 循环更有效?
【发布时间】:2010-12-20 16:55:44
【问题描述】:

所以我有这个 for 循环,里面有 36 个 if 查询。关于提高效率的任何建议? 可以查看完整代码here

这是它的外观示例:

$numbers = range(1, 36);
shuffle($numbers);  
for ($m =0; $m<37; $m++){
    if ($numbers[$m] == "1"){
        $mirza[$m] = "RUTHIE";
        $mage[$m] = "3";
        $mquote[$m] = "I get to learn a lot of new things here, like sign language!";
        $link[$m] = "http://www.google.com";
    }

    if ($numbers[$m] == "2"){
        $mirza[$m] = "AIDA";
        $mage[$m] = "82";
        $mquote[$m] = "This is like a club and I know and like all the members. It's good therapy.";
        $link[$m] = "/about/";
    }

    if ($numbers[$m] == "3"){
        $mirza[$m] = "AMIRE";
        $mage[$m] = "4";
        $mquote[$m] = "I am learning how to share and make friends.";
        $link[$m] = "/about/";
    }
}

【问题讨论】:

  • 为什么要让这个“更有效率”。它运行缓慢吗?它看起来就像你可以得到的一样高效,而不会真正掩盖正在发生的事情......
  • mizra - 您似乎对找到的解决方案感到满意,但我真的建议您继续寻找。我发布了一些稍微好一点的东西,但你真的应该查看一个包含 mirza, mage, mquote, 和 link 字段的数据库

标签: php wordpress loops performance for-loop


【解决方案1】:

将您的 if-s 更改为带有适当中断的开关,或者更糟糕的是 if..elseif..etc 将意味着不必评估所有 if。

【讨论】:

    【解决方案2】:

    当您拥有这么多数据时,它确实应该在数据库(可能是 XML 或文档样式)或文本文件中。

    不过,我将向您展示一种改进方法,方法是将所有数据硬编码在一个地方,并消除对任何 if 或 switch 语句的需求。您至少应该更改 switch 语句,最好还是将所有数据硬编码在一个地方(如下),最好还是获取一个存储这些值的数据库或 CSV 文本文件。

    $data = array( 
             array('mirza' => 'RUTHIE', 'mage' => '3', 'mquote' => 'I get to learn a lot of new things here, like sign language!', 'link' => 'http://www.google.com'),
             array(......
                 );
    
    $numbers = range(1, 36);
    shuffle($numbers);  
    for ($m =0; $m<37; $m++){
         $index = $numbers[$m];
         $mirza[$m] = $data[$index]['mirza'];
         $mage[$m] = $data[$index]['mage'];
         $mquote[$m] = $data[$index]['mage'];
         $link[$m] = $data[$index]['link'];
     }
    

    需要明确的是,这里的“效率”问题并不是速度(尽管这种方式更快)。你所拥有的东西是维护和改变的噩梦。

    您最好认真重新考虑您的应用程序的设计,特别是制作一个以mirza, mage, mquote, link 作为字段的对象。

    【讨论】:

    • 这里可能存在一个单独的问题,但这可以通过将$numbers 更改为从 0 开始我们将$data 更改为从 1 开始来解决
    【解决方案3】:

    您是否觉得自己有太多的“if”语句?尝试使用 switch 语句。从技术上讲,您的循环尽可能高效(使用 big-O 方法评估效率)。

    for ($m =0; $m<37; $m++){
        switch($numbers[$m])
        {
            case 1:
                $mirza[$m] = "RUTHIE";
                $mage[$m] = "3";
                $mquote[$m] = "I get to learn a lot of new things here, like sign language!";
                $link[$m] = "http://www.google.com";
            break;
            case 2:
                $mirza[$m] = "AIDA";
                $mage[$m] = "82";
                $mquote[$m] = "This is like a club and I know and like all the members. It's good therapy.";
                $link[$m] = "/about/";
            break;
            case 3:
                $mirza[$m] = "AMIRE";
                $mage[$m] = "4";
                $mquote[$m] = "I am learning how to share and make friends.";
                $link[$m] = "/about/";
            break;
        }
    }
    

    【讨论】:

    • 一个switch语句不等同于他单独的if语句。
    • 不,不是。但我认为这就是重点,因为问题是原始发帖人如何使他的代码更有效率。但是,输出应该是等效的。
    【解决方案4】:

    我猜它已经和你需要的一样快了。

    使其更快的唯一方法是查看对 PHP 进行基准测试的网站,并进行调整以简化最有效的 PHP 内部结构。

    由于 PHP 内部结构可能会随着时间而改变(通过 PHP 更新),除非您定期对代码进行基准测试,否则我会说您不会有太多收获,尤其是对于如此简单的代码。

    例如你可以尝试改变

    $numbers[$m] == "2"
    

    与

    $numbers[$m] === 2
    

    或

    $numbers[$m] === "2"
    

    但是,如果您不对代码进行基准测试(例如,将其放入函数中并测量超过 10.000 次迭代的执行时间),您将对改进视而不见。 PHP 内部速度并不总是如您所愿。

    (你得到的关于 switch 语句的答案也是如此。试试吧,但是基准测试!)

    【讨论】:

      【解决方案5】:

      我的建议是尝试使用数据结构,并将所有这些值放入与数据结构相同类型的数组中。这样,如果您以后需要使用相同的数字-值关系再次访问这些值,您就不必像在此处所做的那样重新定义所有内容。那么你所要做的就是使用数组索引来访问这些值。

      【讨论】:

      • PHP 没有严格的“类型”系统(在这方面类似于 python)。由于无论如何数据似乎都是独一无二的,他现在正在这样做。他没有将 arrayA[0] 与 arrayB[0] 匹配,而是简单地设置 arrayA[0] = "His string"
      • @RageD 他肯定在做某事。没有冒犯您的回答,但是在这种情况下使用 if 语句是荒谬的,并且开关只是稍微好一点。真正的问题是不需要任何类型的条件。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 2017-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-29
      • 1970-01-01
      相关资源
      最近更新 更多