Я знаю, что это лет, но мне нужно кое-что указать для будущих googlers:
"foreach" требует загрузки и завершения данных, из которых вы извлекаете данные - например, массив, который вы зациклите, уже будет в памяти.
"while" требует только одного значения (может быть data или false - продолжать ли цикл). Для правильного программирования цикла, циклу while необходимо загрузить только следующее значение, а не весь набор данных. Таким образом, если вы запрограммируете цикл while для извлечения его данных из функции, вы можете значительно сократить использование памяти.
Примером может быть итерация по каждой строке большой базы данных с миллионами строк; используя foreach, вам нужно загрузить весь набор данных, чтобы выполнить цикл, который бы съел вашу память живым. но используя функцию, которая вытягивает только следующий необходимый ряд, вы успешно завершите цикл.
псевдокод ниже объясняет:
function nextrow ()
{
static myquery = sql_query('SELECT * FROM `hugetable`')
return(next_row(myquery));
}
while(row = nextrow()) { ...do stuff... }