【问题标题】:Is it wise to call a method and nested loop in a foreach loop?在 foreach 循环中调用方法和嵌套循环是否明智?
【发布时间】:2010-09-20 10:01:33
【问题描述】:

您好,我有一个方法可以返回一组支持票。每张支持票可以有很多注释,所以我有一个方法可以返回带有该票号的票证数组。我想在票据旁边显示注释,这意味着将获取注释嵌套在 foreach 循环中。

foreach($tickets as $ticket){
     //display ticket info

     //now get ticket notes using method getNotes()

     foreach($ticketnote as $note){
         //display note
     }
}   

这样的嵌套循环对性能有影响吗?这是好的做法吗?

【问题讨论】:

  • (sidenote) 对于简单的列表,我发现implode 通常是foreach 的更快替代方案。

标签: php methods foreach nested-loops


【解决方案1】:

这不是问题。

这样的嵌套循环对性能有影响吗?这是好的做法吗?

嵌套循环没有特定的性能影响。

当然,可能会处理大量数据;根据它的大小,您可能达到内存或性能限制。但这是给定的,如果您使用不同的控制结构而不是嵌套循环,也会发生这种情况。

基于数组/foreach() 的解决方案总是需要在开始处理之前将完整的数据集加载到内存中。

如果您要从数据库中获取数据,您可以考虑重新构建函数,以便它们逐个获取和处理数据库记录,而不是将它们全部加载到数组中,然后foreaching 处理它们。这允许您处理大于脚本内存限制的数据集。

【讨论】:

  • 感谢您的回复!在 foreach 循环中使用 note 对象后,我是否必须销毁它?我问的原因是我得到的是第二次使用它时我得到“尝试获取非对象的属性..”
  • @Jonesy 在没有看到一些实际代码的情况下无法回答,但通常不会:新函数调用会覆盖旧对象。
【解决方案2】:

好吧,程序会按照您的指示去做。它将通过所有票据的每个票据。如果必须这样做 - 它必须完成。到目前为止,如果您必须遍历所有这些,则不存在更好的做法。唯一的性能影响是比没有嵌套循环的迭代次数更多,但没有嵌套循环你将得不到任何结果。

【讨论】:

    【解决方案3】:

    只有当您拥有过多的票据和票据时才会影响性能。所以,如果你有 1000 张票,每张票有 1000 张钞票,那么内部循环将运行 c。 1,000,000 次。但是,正如其他人所说,如果有必要这样做,那就有必要了。

    【讨论】:

      【解决方案4】:

      其他人已经为您指明了正确的方向。

      然而,另一个尚未提及且值得(可能?)研究的方法是Spl Iterators

      $iter = new RecursiveIteratorIterator(new RecursiveArrayIterator($array));
      
      foreach($iter as $key=>$value) {
          echo $key.' =>'.$value;
      }
      

      【讨论】:

      • 它有什么作用?它如何优于常规方法?它有什么优势?
      • 1. 这是一个模糊的问题。它可以为您提供一种遍历多维数组的方法。 2. 我从来没有说过它是优越的,我只是说这是一种“另一种方法”。我没有做任何基准来比较。 3. 更简洁的代码(尽管有争议)作为嵌套的 foreach 循环可能会变得非常混乱。
      【解决方案5】:

      在第一次观察时,由于无论如何您都会显示“票据”,因此无论您是在单个循环中还是在两个嵌套循环中执行此操作都无关紧要。净迭代次数将相同。

      在演示问题上,一次显示所有这些信息是不明智的。你肯定会想要应用某种分页。

      【讨论】:

        【解决方案6】:

        绝对不是一个好习惯,但我从来没有找到比这更好的解决方案。

        【讨论】:

          猜你喜欢
          • 2015-07-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-06
          • 1970-01-01
          • 2015-07-17
          相关资源
          最近更新 更多