Выпадающий список HTML с отступом с иерархической моделью смежности MySQL и PHP

#php #mysql #treeview #html-select #adjacency-list-model

#php #mysql #просмотр дерева #html-выберите #модель смежности-списка

Вопрос:

Мне нужен очень распространенный выпадающий список select, который отображает иерархические элементы, в которых все дочерние элементы имеют отступ, добавив, что amp;nbsp; я добрался до заполнения выпадающего списка в php с правильным иерархическим порядком, но не могу заставить его отступать. Как мне правильно сделать отступ в выпадающем списке, используя трюк с пробелом, когда элементы отображаются в правильном порядке (дочерние элементы под правильными родителями), просто без отступа?

В Mysql у меня есть таблица со столбцами Category_ID имя_элемента и Parent_ID.

В php, используя запрос, я извлекаю таблицу с самоссылками, в которой есть столбцы Category и Parent

В php, используя извлеченную таблицу категорий и непосредственную родительскую категорию, я вызываю функцию ParseTree(); которая принимает массив результатов sql и возвращает массив полной древовидной структуры.

В php я вызываю функцию printTree(); между <select> тегами, которая рекурсивно перебирает массив дерева и отображает каждый узел с <option> тегами.

Внутри printTree() есть функция printChildren(), целью которой является добавление отступов ко всем дочерним массивам, если они найдены. Это не работает.

Желаемый результат:

 <select>
 <option>Root</option>
 <option>Root</option>
  <option>amp;nbsp;Child Level 1</option>
   <option>amp;nbsp;amp;nbsp;Child Level 2</option>
     <option>amp;nbsp;amp;nbsp;amp;nbsp;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 .= "amp;nbsp;amp;nbsp;";
        if(!is_null($childrenarray) amp;amp; count($childrenarray) > 0) {

            foreach($childrenarray as $node) {

                echo '<option>' . $indent . $node['name'] . '</option>';
                printChildren($node['children']);

            }
        }
    }

    if(!is_null($tree) amp;amp; count($tree) > 0) {

        foreach($tree as $node) {

            echo '<option>' . $indentpaddingval . $node['name'] . '</option>';


            if(!is_null($node['children']) amp;amp; count($node['children']) > 0) {

                printChildren($node['children']);
            }

        }

    }

}

?>
 

HTML / PHP ДЛЯ ВЫПОЛНЕНИЯ ФУНКЦИЙ И ЗАПОЛНЕНИЯ SELECT

 <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>
 

Я добавляю сюда проанализированный массив, содержащий все дерево категорий в родительских / дочерних массивах:

 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] => 
                                        )

                                )

                        )

                )

        )

)

 

Комментарии:

1. все в порядке, если вы показываете данные для этого $row = mysqli_fetch_assoc($result)

2. @Dharman Но он создает раскрывающийся список select в php

3. Трудно представить, что Root Root и child level1 и child level 2 . . . и т. Д. Лучше дают желаемый результат с образцами данных

4. @Dharman после этой строки HTML/PHP TO EXECUTE FUNCTIONS AND POPULATE SELECT выпадающий список select будет оформлен в php с помощью html

5. @Dharman Мой вопрос заключался не в том, как создавать простые статические выпадающие списки в HTML, а в том, как использовать PHP для динамического добавления различных значений amp;nbsp для отступа параметров в зависимости от того, насколько далеко они находятся в дереве (также неизвестно).). Если вы знаете, как это сделать без PHP, пожалуйста, покажите мне, как.

Ответ №1:

Насколько я понимаю, если categoryid — это дифференциация всех продуктов, тогда мой ответ будет работать для вас.

Нет необходимости снова присоединяться к той же таблице слева.

 $sql = 'select cat_ID from categories_tbl';
$result = mysqli_query($db, $sql);
echo '<select class="form-control">';
while ($row = mysqli_fetch_assoc($result)){
    $sqlcat_name  = "select cat_Name from categories_tbl where parent_ID="."'".$row['cat_ID']."'"; 
    // echo this query to check that properly formed
    $Secondresult = mysqli_query($db, $sqlcat_name);
    $num_rows     = mysql_num_rows($Secondresult);
    $Secondrow    = mysqli_fetch_assoc($Secondresult)
    for($a=0;$a<$num_rows;$a  ){
        echo'<option>';
        for($b=0;$b<$a;$b  ){
            echo"   ";
        }
        echo "$Secondrow[$a]"."</option>";
    }
}
echo '</select>';
 

Комментарии:

1. Спасибо, но это не работает. Я думаю, что понимаю вашу идею, запустите sql для каждой строки, чтобы получить дочерние категории. Пожалуйста, я думаю, что в вашем ответе есть некоторые ошибки, возможно, просто синтаксис, я не могу полностью понять, что происходит. Также этот код предназначен только для двух уровней?

2. Первая ошибка, которую я получаю, — это неопределенное смещение 0, 1 и т. Д. Для echo «$Secondrow[$a]».»</option>»;;

3. Я думаю, что есть несколько вещей, которые могут быть неправильными, или я не понимаю, как использовать этот код. Каждая категория может иметь только один parent_ID, но у каждого parent_ID может быть много дочерних элементов. Пожалуйста, посмотрите, можете ли вы проверить свой код. Спасибо.

Ответ №2:

Код, который работал для меня, и мой вопрос выше оказались следующими. Мне просто нужно было подсчитать, сколько раз вызывалась моя рекурсивная функция для заполнения выбора, и каждый раз, когда функция вводила новый уровень категорий, я мог использовать значение count для повторения строки ‘amp;nbsp’ по мере необходимости, добавляя больше для каждого уровня, который был повторен.

Это правильно выровняло узлы в каждой категории в select, чтобы пользователи могли видеть, какие подкатегории относятся к какой родительской категории.

Для этого я использовал статическую переменную, но намерен заменить ее лучшим методом.

Я публикую часть своего кода, которая создает выпадающий список select, на случай, если кто-нибудь сочтет это полезным.

 
             function printTree($tree) {


                        function printChildren($childrenarray) {
                               static $level = 1;
                            if(!is_null($childrenarray) amp;amp; count($childrenarray) > 0){
                               $level  ; 
                                        foreach($childrenarray as $node) {

                                            echo '<option>'.str_repeat('amp;nbsp;', $level).$node['name'].'</option>';

                                                printChildren($node['children']);


                                        }

                                --$level;

                            }
                        }

                    if(!is_null($tree) amp;amp; count($tree) > 0){

                        foreach($tree as $node) {
                            echo '<option bg-danger>'.$node['name'].'</option>';

                                if (!is_null($node['children']) amp;amp; count($node['children']) > 0 ) {

                                    printChildren($node['children']);
                                }

                        }
                    }

             }