Разумно ли вызывать метод и вложенный цикл в цикле foreach? - PullRequest
2 голосов
/ 20 сентября 2010

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

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

     //now get ticket notes using method getNotes()

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

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

Ответы [ 6 ]

3 голосов
/ 20 сентября 2010

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

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

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

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

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

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

1 голос
/ 20 сентября 2010

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

Тем не менее, еще один подход, который еще не упомянут, и который стоит (возможно?) - это Spl Iterators

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

foreach($iter as $key=>$value) {
    echo $key.' =>'.$value;
}
1 голос
/ 20 сентября 2010

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

1 голос
/ 20 сентября 2010

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

0 голосов
/ 20 сентября 2010

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

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

0 голосов
/ 20 сентября 2010

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

...