Всё просто, первым делом строишь массив, в качестве ключа которого выступает родитель, а значения массив всех его потомков. (один цикл)
Далее пишешь функцию которая на вход принимает этот массив и ид элемента на вывод. В функции выводишь див, значение, в цикле вызываешь эту функцию для всех потомков (т.е. из массива по ключу ид), закрываешь див. Профит.
ну а первый вызов функции пишешь как цикл который вызывает функцию для всех значений в массиве под ключом нуль.
Спасибо за подсказку, из гугла узнал, как выстороить многомерный массив в конструкцию с вложенными divами с помощью рекурсивной функции.
Самогонщик пишет:Всё просто, первым делом строишь массив, в качестве ключа которого выступает родитель, а значения массив всех его потомков. (один цикл)
что только не курил не смог придумать нормального алгоритма по корректному конверту моего исходного одномерного массива в многомерный
если кто сталкивался с подобным или знает решение этой задачки просьба чиркануть этот алгоритм, пойдет даже в грубом общем виде.
в исходном одномерном массиве ключ - потомок, его значение - родитель. Элементы с значением "0" - корневые.
пробовал так :
PHP:
скопировать код в буфер обмена
$a=array('111'=>'0','222'=>'0','333'=>'0','444'=>'222','555'=>'333', '666'=>'333','777'=>'555','888'=>'777');
foreach ($a as $k=>$v)
{
if($a[$k]=="0")
{
$b[$k]=$c;
}
}
echo '<pre>';
echo '</pre><hr>';
foreach ($a as $k=>$v)
{
if($v!="0")
{
$b[$v]=$c;
}
}
echo '<pre>';
echo '</pre><hr>';
получается не то что нужно
еще раз спасибо, очень близко к нужному, но к сожалению тоже не то.
в конечном виде должно получиться примерно так :
объясню для чего это все мне нужно, возможно есть решение намного проще.
есть некий топик в форуме, отображение обсуждений представлено в виде
иерархической структуры, то есть, есть в топике есть новые вопросы или предложения (корневые элементы) и есть ответы или комментарии к ним.
вопросы прижаты влево, каждый новый комментарий к этому вопросу сдвигается все левее. в общем, все как на обычном форуме.
в базе данных постов имеются примерно такие записи :
...| ID | PARENT_ID|...
----------------------------
...| 111|- |...
...| 222|- |...
...| 333|- |...
...| 444|222 |...
...
ну и так далее, как в исходном массиве, что я писал выше, где ID ид поста, PARENT_ID -
ид его родительского поста.
на странице должны быть видны только корневые посты, заключенные в специальные div-слайдеры с плюсиком, нажав на который, вопрос разварачивается и становятся видны все ответы, аналогично заключенные в блоки слайдеры, которые в свою очередь так же могут иметь некоторое количество ответов.
визуально это должно выглядеть примерно так :
вопрос №111 [-]
..(нет ответов)
вопрос №222 [-]
.. ответ №444 на вопрос №222 [-]
вопрос №333
.. ответ №555 на вопрос №333 [-]
.... ответ №777 на вопрос №555 [-]
.... ответ №888 на вопрос №555 [-]
.. ответ №666 на вопрос №333 [-]
...
...
...
нажимая на [-] он изменяется на [+] и все зависимые посты при этом сворачиваются, не тратя внимание пользователя на то что ему не нужно. вот такая задача..
РоманРоманыч пишет:в конечном виде должно получиться примерно так :
Ещё одним циклом можно получить и такое, но зачем?
Вот полный работающий пример, написанный согласно описанию в моём первом посте.
PHP:
скопировать код в буфер обмена
$a=array('111'=>'0','222'=>'0','333'=>'0','444'=>'222','555'=>'333','666'=>'333','777'=>'555','888'=>'777');
foreach ($a as $k=>$v)
$b[$v][] = $k;
if($b['0'])
foreach($b['0'] as $child)
out_rec($b, $child);
function out_rec($dic, $curr)
{
echo "<div>\n";
echo $curr,"\n";
if($dic[$curr])
foreach($dic[$curr] as $child)
out_rec($dic, $child);
echo "</div>\n";
}
Как видно, такого подготовленного массива вполне достаточно для вывода дерева.
Хотя все эти подготовки - это муть, можно и без них
PHP:
скопировать код в буфер обмена
$a=array('111'=>'0','222'=>'0','333'=>'0','444'=>'222','555'=>'333','666'=>'333','777'=>'555','888'=>'777');
foreach($a as $k=>$v)
if($v=='0')
out_rec($a, $k);
function out_rec($dic, $curr)
{
echo "<div>\n";
echo $curr,"\n";
foreach ($dic as $k=>$v)
if($v == $curr)
out_rec($dic, $k);
echo "</div>\n";
}