У меня есть таблица 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; ?>
Я думаю, что лучший способ сделать это может состоять в том, чтобы создать объекты для каждой части верхнего уровня, а затем создать рекурсивный цикл для создания объектов для каждой вложенной части внутри нее, а также для каждой из них и т.д.
Однако объекты для меня довольно новые, так возможно ли это?
Мне удалось решить это самостоятельно, создав объект, который затем ищет в таблице 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');
Вы можете использовать этот запрос... чтобы просто получить данные так, как вы хотите... WOW, я сделал это с помощью запроса: 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