2

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

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

     //now get ticket notes using method getNotes()

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

像这样的嵌套循环对性能有影响吗?这是好习惯吗?

4

6 回答 6

3

这算不上问题。

像这样的嵌套循环对性能有影响吗?这是好习惯吗?

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

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

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

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

于 2010-09-20T10:04:51.537 回答
1

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

于 2010-09-20T10:04:40.523 回答
1

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

于 2010-09-20T10:05:52.307 回答
1

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

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

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

foreach($iter as $key=>$value) {
    echo $key.' =>'.$value;
}
于 2010-09-20T10:11:17.253 回答
0

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

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

于 2010-09-20T10:06:44.567 回答
-1

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

于 2010-09-20T10:05:37.137 回答