Есть 2 массива: $menu и $tree
print_r($menu):
Array (
[1] => Array ( [id] => 1 [pid] => 0 [name] => Новости1)
[2] => Array ( [id] => 2 [pid] => 0 [name] => Новости2)
[3] => Array ( [id] => 3 [pid] => 0 [name] => Новости3)
[4] => Array ( [id] => 4 [pid] => 0 [name] => Новости4)
[5] => Array ( [id] => 5 [pid] => 0 [name] => Новости5)
)
print_r($tree):
Array (
[1] => Array ( [id] => 6 [pid] => 1 [name] => Новости6)
[2] => Array ( [id] => 7 [pid] => 1 [name] => Новости7)
[3] => Array ( [id] => 8 [pid] => 3 [name] => Новости8)
[4] => Array ( [id] => 9 [pid] => 4 [name] => Новости9)
[5] => Array ( [id] => 10 [pid] => 6 [name] => Новости10)
[1] => Array ( [id] => 11 [pid] => 7 [name] => Новости11)
[2] => Array ( [id] => 12 [pid] => 8 [name] => Новости12)
[3] => Array ( [id] => 13 [pid] => 5 [name] => Новости13)
[4] => Array ( [id] => 14 [pid] => 10 [name] => Новости14)
[5] => Array ( [id] => 15 [pid] => 11 [name] => Новости15)
)
Вопрос:
Как выстроить дерево(что-то типа рекурсии), что бы выводились основные разделы $menu и затем вытягивались со второго массива именно те элементы которые являются детьми $menu, при этом далее во втором массиве выбирались уже дети массива $tree и так до конца?
Написал код, но дальше не знаю как:
foreach($menu as $k=>$v){
echo "<ul><li>".$v['name']."</li>";
echo "<ul>";
foreach($tree as $kt=>$vt){
$id =$v['id'];
if($vt['pid'] == $id){
echo "<li>".$vt['name'];
$id = $vt['id'];
}
}
echo "</ul>";
echo "</ul></div>";
}
Получается что у меня выводится только первые pid, а потом не знаю как реализовать дальше.
Помогите плиз.
Спустя 1 час, 23 минуты, 2 секунды (30.08.2010 - 00:23) Phobos98 написал(а):
А зачем такие сложности? Раз у тебя "есть 2 массива", значит они гдето формируются. Формируй многомерный массив, а не 2 отдельных.
Либо если так хочется 2 отдельных, то пусть во втором массиве у тебя ключами будут идентификаторы первого (тобишь совпадали).
ммм...
Как то так... если второй вариант, только запятые не забудь
Либо если так хочется 2 отдельных, то пусть во втором массиве у тебя ключами будут идентификаторы первого (тобишь совпадали).
ммм...
$menu =
Array (
[1] => Array ( [id] => 1 [pid] => 0 [name] => Новости1)
[2] => Array ( [id] => 2 [pid] => 0 [name] => Новости2)
[3] => Array ( [id] => 3 [pid] => 0 [name] => Новости3)
[4] => Array ( [id] => 4 [pid] => 0 [name] => Новости4)
[5] => Array ( [id] => 5 [pid] => 0 [name] => Новости5)
)
$tree =
Array (
[1] => Array (
Array ( [id] => 6 [pid] => 1 [name] => Новости6)
Array ( [id] => 11 [pid] => 7 [name] => Новости11)
)
[2] => Array (
Array ( [id] => 7 [pid] => 1 [name] => Новости7)
Array ( [id] => 12 [pid] => 8 [name] => Новости12)
)
[3] => Array (
Array ( [id] => 8 [pid] => 3 [name] => Новости8)
Array ( [id] => 13 [pid] => 5 [name] => Новости13)
)
[4] => Array (
Array ( [id] => 9 [pid] => 4 [name] => Новости9)
Array ( [id] => 14 [pid] => 10 [name] => Новости14)
)
[5] => Array (
Array ( [id] => 10 [pid] => 6 [name] => Новости10)
Array ( [id] => 15 [pid] => 11 [name] => Новости15)
)
)
Как то так... если второй вариант, только запятые не забудь
Спустя 7 часов, 59 минут, 50 секунд (30.08.2010 - 08:23) linker написал(а):
Если не хочешь сильно заморачиваться, то так
foreach($menu as $key => $item)
{
echo $item['name'];
foreach($tree as $treeitem)
{
if ($item['id'] == $treeitem['pid']) echo $treeitem['name'];
}
}
Спустя 2 часа, 42 минуты, 14 секунд (30.08.2010 - 11:05) j11 написал(а):
linker, получается что я вывожу только 1 уровень вложенности, а мне нужно всё дерево, тобиш потом как-то брало id $treeitem и искало уже в $treeitem pid и так до тех пор пока не закончится дерево
Phobos98, так не пойдёт.
Phobos98, так не пойдёт.
Спустя 33 минуты, 31 секунда (30.08.2010 - 11:38) linker написал(а):
Если в $tree есть дети из массива $tree то так не сработает ничего. Сливай все в один массив.
$menu = array(1 => array('id' => 1, 'pid' => 0, 'name' => 'Новости1'),
2 => array('id' => 2, 'pid' => 0, 'name' => 'Новости2'),
3 => array('id' => 3, 'pid' => 1, 'name' => 'Новости1.1'),
4 => array('id' => 4, 'pid' => 3, 'name' => 'Новости1.1.1'));
function getchilds($id, &$result)
{
global $menu;
foreach($menu as $key => $item)
{
if ($item['pid'] == $id)
{
$result[$key]['name'] = $item['name'];
$result[$key]['childs'] = array();
getchilds($item['id'], $result[$key]['childs']);
}
}
}
$result = array();
foreach($menu as $key => $item)
{
if (!$item['pid'])
{
$result[$key]['name'] = $item['name'];
$result[$key]['childs'] = array();
getchilds($item['id'], $result[$key]['childs']);
}
}
print_r($result);
Спустя 1 час, 33 минуты, 8 секунд (30.08.2010 - 13:12) j11 написал(а):
спасибо большое, но надо что бы именно 2 массива было, тоесть начиналось с первого. просто нужно меню выстроить и сделать надо именно по двум:
1.Меню
1.1Меню
1.2Меню
1.2.1Меню
1.2.2Меню
2.Меню
2.1Меню
2.1.1Меню
2.1.1.1Меню
Тоесть Меню1 и Меню2 - это с первого массива,а дальше уже выбираются дети. При этом дальше шёл любой уровень вложенности.
Помогите плиз.....Готов заплатить)))
1.Меню
1.1Меню
1.2Меню
1.2.1Меню
1.2.2Меню
2.Меню
2.1Меню
2.1.1Меню
2.1.1.1Меню
Тоесть Меню1 и Меню2 - это с первого массива,а дальше уже выбираются дети. При этом дальше шёл любой уровень вложенности.
Помогите плиз.....Готов заплатить)))
Спустя 3 минуты, 2 секунды (30.08.2010 - 13:15) linker написал(а):
Все аналогично, только во втором из $tree
function getchilds($id, &$result)
{
global $tree;
foreach($tree as $key => $item)
{
if ($item['pid'] == $id)
{
$result[$key]['name'] = $item['name'];
$result[$key]['childs'] = array();
getchilds($item['id'], $result[$key]['childs']);
}
}
}