Мне нужен очень распространенный выпадающий список, который отображает иерархические элементы, в которых все дочерние элементы имеют отступ, добавляя
Я получил возможность заполнить выпадающий список в php с правильным иерархическим порядком, но не могу получить его в отступ , Как правильно сделать отступ в выпадающем меню, используя трюк с пробелом, когда элементы отображаются в правильном порядке (дети под нужными родителями), а не с отступом?
В Mysql у меня есть таблица со столбцами Category_ID Item_Name и Parent_ID.
В php, используя запрос, я получаю таблицу со ссылками на нее, в которой есть столбцы Category и Parent
В php, используя выбранную таблицу категорий и непосредственную родительскую категорию, я вызываю функцию parseTree (); который принимает массив результатов sql и возвращает массив полной древовидной структуры.
В php я вызываю функцию printTree (); между тегами <select>
, которые рекурсивно перебирают массив дерева и отображают каждый узел тегами <option>
.
Внутри printTree () есть функция printChildren (), целью которой является добавление отступов ко всем дочерним массивам, если они найдены. Это не работает.
Желаемый результат:
<select>
<option>Root</option>
<option>Root</option>
<option> Child Level 1</option>
<option> Child Level 2</option>
<option> Child Level 3</option>
</select>
и т.д ....
PHP
<?php
$sql = "SELECT
e.cat_Name AS 'Category',
m.cat_Name AS 'Parent Category'
FROM
categories_tbl e
lEFT JOIN
categories_tbl m ON m.cat_ID = e.parent_ID";
$result = mysqli_query($db, $sql);
function parseTree($tree, $root = "")
{
$return = array();
# Traverse the tree and search for direct children of the root
foreach($tree as $child => $parent) {
# A direct child is found
if($parent == $root) {
# Remove item from tree (we don't need to traverse this again)
unset($tree[$child]);
# Append the child into result array and parse its children
$return[] = array(
'name' => $child,
'children' => parseTree($tree, $child)
);
}
}
return empty($return) ? NULL : $return;
}
function printTree($tree)
{
$indent = "";
function printChildren($childrenarray)
{
$indent .= " ";
if(!is_null($childrenarray) && count($childrenarray) > 0) {
foreach($childrenarray as $node) {
echo '<option>' . $indent . $node['name'] . '</option>';
printChildren($node['children']);
}
}
}
if(!is_null($tree) && count($tree) > 0) {
foreach($tree as $node) {
echo '<option>' . $indentpaddingval . $node['name'] . '</option>';
if(!is_null($node['children']) && count($node['children']) > 0) {
printChildren($node['children']);
}
}
}
}
?>
HTML / PHP ДЛЯ ВЫПОЛНЕНИЯ ФУНКЦИЙ И ВЫБОРА НАСЕЛЕНИЯ
<select class="form-control">
<?php
$cat_tree_arr = array();
while ($row = mysqli_fetch_assoc($result)) {
$cat_tree_arr[$row['Category']] = $row['Parent Category'];
}
$result = parseTree($cat_tree_arr);
printTree($result);
?>
</select>
Я добавляю проанализированный массив, содержащий все дерево категорий, в массивы Parent / Children:
Array
(
[0] => Array
(
[name] => All Raw Materials
[children] => Array
(
[0] => Array
(
[name] => Bag Raw Materials
[children] => Array
(
[0] => Array
(
[name] => LDPE Materials
[children] =>
)
)
)
)
)
[1] => Array
(
[name] => All Finished Goods
[children] => Array
(
[0] => Array
(
[name] => Local Finished Goods
[children] => Array
(
[0] => Array
(
[name] => Local Bags
[children] =>
)
)
)
[1] => Array
(
[name] => Export Finished Goods
[children] => Array
(
[0] => Array
(
[name] => Export Bags
[children] =>
)
)
)
)
)
)