обработка дерева c pid>id

Scarrr

Новичок
обработка дерева c pid>id

Возможно тема задана неверно, но я не знаю как ее назвать лучше :)

В обще суть такова.
Есть таблица в мускуле вида
PHP:
| id | pid | links   |
+---+-----+----------+
| 1  |  0   | news   |
| 2  |  0   | links  |
| 3  |  2   | comms  |
| 4  |  2   | adverts|
+---+-----+----------+
Когда работаю с этой таблицей при проходе foreach-ем я формирую из поля links ссылку типа ?links&comms (в данном случае считается что я перехожу в подмодуль comms модуля links)
причем делается это примерно так

PHP:
foreach ($src as $k=>$v){
if ($v['pid']) $dest[$k]['links'].=$dest[$v['pid']]['links']; 
else $dest[$k]['links']=$v['links'];
}
(код дан примерно, по памяти)
Этот алгоритм четко работает в случае если pid<id. Т.е. при обработке foreach-ем родителькие записи оказываются выше и обрабатываются раньше потомков.
В случае, если pid>id , т.е. в таблице предок записан ниже записи потомка, то при обработке foreach эта запись ($dest['links']) пропускается как еще несуществующая и естественно контантенация не происходит, или происходит некоректно (в случае нескольких наследников указанных в разных местах и разному порядке).

Прошу объяснить как бороться с данной проблемой, что использовать и т.п.
 

Scarrr

Новичок
пробовал
спасает не всегда... там имхо алгоритм какой-то нужен....
 

Scarrr

Новичок
у меня это в куче задач возникает проблема.
пример я привел, когда формирую ссылки...
 

Z.O.S.

Новичок
тогда вот тебе алгоритм в обсчих чертах:
сортируешь массив по pid в обратном порядке
выбераешь поочереди записи
вложенным циклом ищеш родителя в том же массиве
и подставляешь перед потомком в результате

если имеется более 2х уровней вложенности используй рекурсию!
 
Сверху