[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Перебор массива
j11
Значит задача такая.
Есть 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 отдельных, то пусть во втором массиве у тебя ключами будут идентификаторы первого (тобишь совпадали).

ммм...


$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, так не пойдёт.

Спустя 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 - это с первого массива,а дальше уже выбираются дети. При этом дальше шёл любой уровень вложенности.

Помогите плиз.....Готов заплатить)))

Спустя 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']);
}
}
}
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.