2010-09-20 69 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