PHP - вложенное дерево данных из таблицы SQL

У меня есть таблица SQL, содержащая список частей с подразделами, которые входят в них. Мне нужно придумать способ вывода данных в дерево, чтобы показать, что входит во что еще.

Таблица проста, как показано ниже:

Part_Number | Sub_Part
1             1a
1             1b
1             1c
1a            1a0
1a            1a1
1b            1b0
2

Итак, из этого мне нужно было бы вывести что-то вроде этого:

-1
--1a
---1a0
---1a1
--1b
---1b0
--1c
-2

Я не могу придумать решение для этого, я пытался использовать циклы внутри циклов для извлечения информации, но лучшее, что я могу получить, это первая часть каждого слоя: 1, 1a, 1a0.

<?php $lookup = ['1']; ?>
    <?php 
        x: 
        $i = $i . '-';
    ?>

    <?php foreach($lookup as $look) : ?>
        <p><?php echo $i . $look; ?></p>
        <?php $lookup = []; ?>

        <?php $query = mysqli_query($conn, "SELECT Sub_Part FROM `Bill_Of_Materials` WHERE Part_Number = '{$look}'"); ?>
        <?php while($search = mysqli_fetch_array($query)) : ?>
            <?php array_push($lookup, $search[0]); ?>
        <?php endwhile; ?>

        <?php goto x; ?>
    <?php endforeach; ?>

Я думаю, что лучший способ сделать это может состоять в том, чтобы создать объекты для каждой части верхнего уровня, а затем создать рекурсивный цикл для создания объектов для каждой подчасти внутри нее, и каждой внутри нее и т. д.

Однако объекты для меня довольно новы, возможно ли это?

Можете ли вы опубликовать ответ $query, чтобы люди могли над ним работать, вы можете изменить данные

BILAL MALIK 21.02.2019 10:13

Возможный дубликат Подключиться к предыдущему эквиваленту для MySQL

Eriks Klotins 21.02.2019 10:15
Примечание: Когда вы пишете PHP-блоки, код будет намного легче читать, если вы открываете однажды<?php и затем закрываете его в конце блока, а не на каждой строке.
M. Eriksson 21.02.2019 10:16

Я пометил это как дубликат. Изучите способы создания иерархических запросов с помощью MySQL.

Eriks Klotins 21.02.2019 10:16

@EriksKlotins это не дубликат, это что-то другое ...

Sayed Mohd Ali 21.02.2019 10:22

Используя бизнес-логику PHP, вы должны создать таблицу с part_id int, part_number char, parent_part_id. Части верхнего уровня имеют родительский элемент NULL. Если у вас предсказуемый макс. уровень вложенности, вы также можете выполнять выбор, группировку и сортировку в SQL.

Quasimodo's clone 21.02.2019 10:35

«это не дубликат, это что-то другое» @EriksKlotins прямо здесь, эти данные представляют собой более или менее иерархическое дерево, но вы усложнили себе задачу, разрешив разные типы данных в одной строке. Эта модель данных очень сомнительна.. нет разделения любого вида между типами.. Не поймите меня неправильно, я предлагаю использовать значения, разделенные запятыми, сейчас....

Raymond Nijland 21.02.2019 11:15

Я сделал это с запросом, проверенным на MySQL, возможно, вам понравится: D

Sayed Mohd Ali 21.02.2019 11:15
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
8
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать этот запрос... чтобы просто получить данные так, как вы хотите... ВАУ, я сделал это с запросом: D

   select t1.Part_Number as parent,t1.parts as g1 from table1 t2 right join (select Part_Number,group_concat(Sub_Part) as parts from table1 group by Part_Number) t1 on t1.Part_Number =  SUBSTRING(t2.Sub_Part, 1, CHAR_LENGTH(t2.Sub_Part)-1) group by t1.Part_Number
Ответ принят как подходящий

Мне удалось решить это самостоятельно, создав объект, который затем ищет в таблице SQL подчасти и создает другой объект для каждой подпрограммы.

class part {
    function __construct($partNumber, $layer = '-') {
        echo $layer . $partNumber . '<br>';

        $conn = mysqli_connect('localhost', 'user', 'pass', 'database');

        if (!$conn) {
            die('Connection Failed: ' . mysqli_connect_error());
        }

        $subs = mysqli_query($conn, "SELECT Sub_Part FROM `Bill_Of_Materials` WHERE Part_Number = '{$partNumber}'");

        while($sub = mysqli_fetch_assoc($subs)) {
            $sub = new part($sub['Sub_Part'], $layer . '-');
        }
    }
}

$a = new part('123');

Другие вопросы по теме