Разумно ли вызывать метод и вложенный цикл в цикле foreach?


Привет, у меня есть метод, который возвращает массив заявок в службу поддержки. В каждом билете службы поддержки может быть много заметок, поэтому у меня есть метод, который возвращает массив заметок о билетах с этим идентификатором билета. Я хочу отобразить заметки рядом с билетом, что означало бы вложение заметок get внутри цикла foreach.

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

     //now get ticket notes using method getNotes()

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

Влияют ли вложенные циклы, подобные этому, на производительность? Это хорошая практика?

Author: svick, 2010-09-20

6 answers

Это не проблема.

Влияют ли вложенные циклы, подобные этому, на производительность? Это хорошая практика?

Вложенные циклы не имеют особых последствий для производительности.

Но, конечно, может быть обработано много данных; в зависимости от их объема вы можете достичь ограничений по памяти или производительности. Но это данность, и это также произойдет, если вы будете использовать другую структуру управления вместо вложенного цикла.

Ан решение на основе массива/foreach() всегда будет требовать загрузки полного набора данных в память перед началом обработки.

Если вы извлекаете данные из базы данных, вы могли бы рассмотреть возможность реструктуризации своих функций, чтобы они извлекали и обрабатывали запись базы данных одну за другой, а не загружали их все в массив и foreach просматривали их. Это позволяет обрабатывать наборы данных, размер которых превышает лимит памяти вашего скрипта.

 3
Author: Pekka 웃, 2010-09-20 10:22:13

Ну, программа делает то, что вы ей говорите. Он пройдет через каждую заметку всех билетов. Если это должно быть сделано - это должно быть сделано. До сих пор лучшей практики не существует, если вам нужно пройти через все из них. Единственным следствием производительности является большее количество итераций, чем было бы без вложенного цикла, но без вложенного цикла вы не получите никаких результатов.

 1
Author: AlexanderMP, 2010-09-20 10:04:40

Последствия для производительности возможны только в том случае, если у вас слишком много билетов и заметок. Итак, если бы у вас было 1000 билетов и в каждом было по 1000 купюр, внутренний цикл выполнялся бы примерно 1 000 000 раз. Но, как говорили другие, если это необходимо сделать таким образом, то это необходимо.

 1
Author: Skilldrick, 2010-09-20 10:05:52

Другие уже указали вам правильное направление.

Однако, еще один подход, о котором еще предстоит упомянуть, и который стоит (возможно?) изучаются итераторы Spl

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

foreach($iter as $key=>$value) {
    echo $key.' =>'.$value;
}
 1
Author: Russell Dias, 2010-09-20 10:11:17

При первом наблюдении, поскольку вы все равно будете отображать "примечания к билетам", не будет иметь большого значения, делаете ли вы это в одном цикле или в двух вложенных циклах. Общее количество итераций будет таким же.

Что касается проблемы с презентацией, неразумно отображать всю эту информацию сразу. Вы, конечно, захотите применить какую-то разбивку на страницы.

 0
Author: Shamim Hafiz, 2010-09-20 10:06:44

Определенно не очень хорошая практика, но я никогда не находил лучшего решения, чем это.

 -1
Author: fabrik, 2010-09-20 10:05:37