function mapTree($dataset, $parent = null, $levels = 0) { if ($levels > 100) { print 'Possible infinite recursion'; return; } $tree = array(); foreach ($dataset as $id => $node) { if ($node['parent'] !== $parent) { continue; } $node['children'] = mapTree($dataset, $id, $levels + 1); $tree[$id] = $node; } return $tree; }
if (!$node['parent']) { // не имеет родителя, т.е. корневой элемент $tree[$id] =& $node; } else { /* Иначе это чей-то потомок этого потомка переносим в родительский элемент, при этом у родителя внутри элемента создастся массив childs, в котором и будут вложены его потомки */ $dataset[$node['parent']]['childs'][$id] =& $node; // } } return $tree; } $newarr = mapTree($dataset); // print_r($newarr); // die(); // функция дает возможность многомерного вывода массива с учетом иерархии // для этого и прописана переменная $margin // но у меня на сайте будет не более 1 подкатегории те 1категория 1.1 подкатегория function array_rekurs($newarr, $margin = 10, $cat = null) { foreach ($newarr as $id => $value) { if ($value[parent] == 0) { $cat = 'cat'; } else { $cat = null; } echo "<li class = '{$cat}'><a href='vitrina.php?cat_id={$value['cat_id']}&parent_id={$value['parent']}'>{$value['name_cat']}</a></li>"; if ($value['childs']) {
$dataset = array(); for ($i = 0; $i < $maxNodes; $i++) { $parent = rand(-1, $i - 1); // We use $i rather than maxNodes here to avoid infinite loops if ($parent == -1) { $parent = null; } $dataset[$i] = array('name' => 'Node ' . $i, 'parent' => $parent); } // Initialize variables $startTime = 10; $endTime = 10; $tree = array(); // Build tree $startTime = microtime(true); $tree = mapTree($dataset); $endTime = microtime(true); // Print benchmark print '<h2>Benchmark</h2>'; print $endTime - $startTime . ' seconds<br>'; // Print tree print '<h2>Tree</h2>'; display_tree($tree); // Print dataset print '<h2>Dataset ' . (count($dataset > 100) ? '(partial)' : '') . '</h2>'; print '<pre>'; if (count($dataset > 100)) { print_r(array_slice($dataset, 0, 100)); } else { print_r($dataset); }
$data[$row[id]] = $row; } function mapTree($dataset) { $tree = array(); foreach ($dataset as $id => &$node) { if (!$node['pid']) { $tree[$id] =& $node; } else { $dataset[$node['pid']]['childs'][$id] =& $node; } } return $tree; } // вызываем функцию и передаем ей наш массив $data = mapTree($data); function view_cat($dataset) { foreach ($dataset as $menu) { echo '<li><a href="?id=' . $menu["id"] . '">' . $menu["text"] . '</a>'; if ($menu['childs']) { echo '<ul>'; view_cat($menu['childs']); echo '</ul>'; } echo '</li>'; } } view_cat($data); ?>