2015-05-08 4 views
1

У меня есть этот код:Как избежать петли внутри петли

foreach($categories as $category) { 
    $items = getItems($category); 

    foreach($items as $item) { 
    // some code to manipulate $item 
    } 
} 

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

PS. Я использую PHP 5.3, поэтому yield не может быть и речи. Также кто-то сказал мне, что может быть рекурсия может быть полезной здесь, но я точно не знаю, как это сделать.

Спасибо за помощь

+3

С чего вы предоставили, я не могу видеть, как алгоритмический избежать это. Вы можете настроить _workflow_ того, что вы пытаетесь сделать, чтобы вам не приходилось одновременно манипулировать элементами каждой категории, а вместо этого просто делать одну категорию за раз –

+0

Выполняет ли getItems запрос базы данных? –

+0

Если вы можете поместить свой код массива и то, что вы ожидали в качестве вывода, тогда любой может предложить решение –

ответ

2

Один из способов, чтобы избежать вложенных циклов для хранения данных, во-первых, а затем манипулировать его

$items=array_map("getItems",$categories); 
$items=array_reduce("array_merge",$items); 
array_walk($items,"item_manipulation"); 

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

Более интеллектуальная оптимизация будет (возможно) возможно если бы мы могли знать, что getItems делает, и какие манипуляции за пункт вы

+0

Звучит неплохо, я сам буду делать тесты. Спасибо за полезный совет :) – Dev01

Смежные вопросы