2010-09-20 131 views
2

嗨我有一种方法,返回支持票数组。每张支持票可以有多个票据,所以我有一个方法可以返回票证号的数组。我想在票据旁边显示注释,这意味着在foreach循环中嵌套获取笔记。在foreach循环中调用方法和嵌套循环是明智的吗?

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

    //now get ticket notes using method getNotes() 

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

像这样的嵌套循环是否会影响性能?这是好的做法吗?

+0

*(阿里纳斯)*对于简单的列表,我发现'implode'经常是更快的替代'foreach'。 – Gordon 2010-09-20 10:34:51

回答

3

这不是问题。

像这样的嵌套循环是否会影响性能?这是好的做法吗?

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

但当然,可能会处理大量的数据;取决于它有多少,你可能达到内存或性能限制。但是,这是一个给定的,如果你会使用不同的控制结构而不是嵌套循环,也会发生。

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

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

+0

感谢您的回复!在foreach循环中使用它之后,我必须销毁该注释对象吗?我要问的原因是我得到的是第二次使用它我试图获得非对象的属性..' – iamjonesy 2010-09-20 10:29:00

+0

@Jonesy都不可能没有看到一些实际的代码来回答,但通常没有:The新的函数调用会覆盖旧的对象。 – 2010-09-20 10:31:16

1

那么,该程序做你告诉它做的。它将通过所有票据的每个音符。如果必须这样做 - 必须完成。到目前为止,如果必须循环遍历所有这些,则不存在更好的实践。唯一的性能影响是更多的迭代,而不是没有嵌套循环的迭代,但没有嵌套循环,你不会得到任何结果。

-1

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

1

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

0

第一次观察,因为无论如何您都会显示'票据票据',所以在单个循环或两个嵌套循环中执行此操作无关紧要。净迭代次数是相同的。

在演示问题上,一次显示所有这些信息并不明智。你当然想要应用某种分页。

1

其他人已经指出你在正确的方向。

然而,另一种形式给出了至今尚未被提及,值得(可能?)寻找到是Spl Iterators

$iter = new RecursiveIteratorIterator(new RecursiveArrayIterator($array)); 

foreach($iter as $key=>$value) { 
    echo $key.' =>'.$value; 
} 
+0

它给了什么?它如何优于常规方法?它给了什么好处? – AlexanderMP 2010-09-20 10:45:09

+0

** 1。**这是一个模糊的问题。它可以给你的是一个迭代多维数组的方法。 ** 2。**我从来没有说过它是优越的,我只是说它是'另一种方法'。我没有做任何比较的基准。 ** 3。**作为嵌套的foreach循环的清除代码(尽管有争议)可能会变得非常混乱。 – 2010-09-20 10:57:31