2

こんにちは、サポート チケットの配列を返すメソッドがあります。各サポート チケットには多くのメモを含めることができるため、そのチケット ID を持つチケット メモの配列を返すメソッドがあります。foreach ループ内に get notes をネストすることを意味するチケットの横にメモを表示したいと思います。

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

     //now get ticket notes using method getNotes()

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

このようなネストされたループはパフォーマンスに影響しますか? これは良い習慣ですか?

4

6 に答える 6

3

問題じゃない。

このようなネストされたループはパフォーマンスに影響しますか? これは良い習慣ですか?

ネストされたループには、特定のパフォーマンスへの影響はありません。

しかしもちろん、大量のデータが処理される可能性があります。その量によっては、メモリまたはパフォーマンスの制限に達する可能性があります。しかし、これは当然のことであり、ネストされたループの代わりに別の制御構造を使用する場合にも発生します。

array-/foreach() ベースのソリューションでは、処理を開始する前に常に完全なデータ セットをメモリにロードする必要があります。

データベースからデータをフェッチしている場合は、関数を再構築して、すべてを配列にロードして上書きするのではなく、データベース レコードを 1 つずつフェッチして処理することを検討できますforeach。これにより、スクリプトのメモリ制限よりも大きいデータ セットを処理できます。

于 2010-09-20T10:04:51.537 に答える
1

他の人はすでにあなたを正しい方向に向けています。

ただし、まだ言及されておらず、調査する価値のある(おそらく?)別のアプローチは、Splイテレータです。

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

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

チケットとメモの数が多すぎる場合にのみ、パフォーマンスに影響があります。したがって、1000枚のチケットがあり、それぞれに1000個のノートがある場合、内側のループはcを実行します。1,000,000回。しかし、他の人が言っているように、このようにする必要がある場合は、それが必要です。

于 2010-09-20T10:05:52.307 に答える
1

プログラムは、あなたが指示したことを実行します。すべてのチケットの各ノートを通過します。それをしなければならない場合は、しなければなりません。これまでのところ、それらすべてをループする必要がある場合、より良い方法はありません。唯一のパフォーマンスへの影響は、ネストされたループがない場合よりも多くの反復ですが、ネストされたループがないと結果が得られません。

于 2010-09-20T10:04:40.523 に答える
0

最初の観察では、とにかく「チケットノート」を表示するので、これを単一のループで行うか、2つのネストされたループで行うかはそれほど重要ではありません。正味の反復回数は同じになります。

プレゼンテーションの問題では、このすべての情報を一度に表示することは賢明ではありません。あなたは確かにある種のページ付けを適用したいと思うでしょう。

于 2010-09-20T10:06:44.567 に答える
-1

確かに良い習慣ではありませんが、私はこれよりも良い解決策を見つけたことがありません。

于 2010-09-20T10:05:37.137 に答える