Как я могу рекурсивно отформатировать все дерево вывода массива вложенных категорий PHP?Php

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Как я могу рекурсивно отформатировать все дерево вывода массива вложенных категорий PHP?

Сообщение Anonymous »

У меня есть вложенное дерево категорий модели в формате массива следующим образом....

Код: Выделить всё

$data = [
[
'categoryId' => '08adf337-a577-4038-86a6-a5cd16676dff',
'name' => 'ELECTRONICS',
'parentId' => 0,
'lft' => 1,
'rgt' => 20,
'level' => 0,
],
[
'categoryId' => '20150966-bbc5-438f-b3eb-1ff0bbc71b8b',
'name' => 'TELEVISIONS',
'parentId' => '08adf337-a577-4038-86a6-a5cd16676dff',
'lft' => 2,
'rgt' => 9,
'level' => 1,
],
[
'categoryId' => '3fb68583-b9f3-4996-86fa-897c825767e4',
'name' => 'TUBE',
'parentId' => '20150966-bbc5-438f-b3eb-1ff0bbc71b8b',
'lft' => 3,
'rgt' => 4,
'level' => 2,
],
[
'categoryId' => 'bca4d77f-9f6f-41da-ad66-e747edcb9482',
'name' => 'LCD',
'parentId' => '20150966-bbc5-438f-b3eb-1ff0bbc71b8b',
'lft' => 5,
'rgt' => 6,
'level' => 2,
],
[
'categoryId' => '9726c8ff-7664-4494-bb2f-3b365e7a6743',
'name' => 'PLASMA',
'parentId' => '20150966-bbc5-438f-b3eb-1ff0bbc71b8b',
'lft' => 7,
'rgt' => 8,
'level' => 2,
],
[
'categoryId' => '576a2266-9f11-4430-b81f-2ac2a536ad9a',
'name' => 'PORTABLE ELECTRONICS',
'parentId' => '08adf337-a577-4038-86a6-a5cd16676dff',
'lft' => 10,
'rgt' => 19,
'level' => 1,
],
[
'categoryId' => '062921a4-e9af-48f6-adba-d623ca2de4ae',
'name' => 'MP3 PLAYERS',
'parentId' => '576a2266-9f11-4430-b81f-2ac2a536ad9a',
'lft' => 11,
'rgt' => 14,
'level' => 2,
],
[
'categoryId' => '3a80ae89-5eba-4407-819c-944e1d360ed9',
'name' => 'FLASH',
'parentId' => '062921a4-e9af-48f6-adba-d623ca2de4ae',
'lft' => 12,
'rgt' => 13,
'level' => 3,
],
[
'categoryId' => '0a03f267-8646-4460-bce7-dc6993e337a3',
'name' => 'CD PLAYERS',
'parentId' => '576a2266-9f11-4430-b81f-2ac2a536ad9a',
'lft' => 15,
'rgt' => 16,
'level' => 2,
],
[
'categoryId' => 'fc9a25d0-a67a-4753-aed8-c148c9c95573',
'name' => '2 WAY RADIOS',
'parentId' => '576a2266-9f11-4430-b81f-2ac2a536ad9a',
'lft' => 17,
'rgt' => 18,
'level' => 2,
],
];
.. и используя PHP, мне нужно преобразовать формат, полученный из выходных данных MySQL выше, в следующий формат:
Ответ, который я нужно:

Код: Выделить всё

$result = array();
$result['items'] = [
[
id =>  08adf337-a577-4038-86a6-a5cd16676dff,
title => 'ELECTRONICS',
children =>  [
[ id: 2, title: 'Child #1' ],
[ id: 3, title: 'Child #2' ],
[
id: 4,
title: 'Child #3',
children: [
[ id: 5, title: 'Grandchild #1' ],
[ id: 6, title: 'Grandchild #2' ],
],
],
],
]
];
Для лучшего понимания я добавил свою таблицу MySQL визуально ниже.
Вот моя таблица MySQL:

Код: Выделить всё

------------------------
MySQL categories table
------------------------

categoryId                              parentId                                name                    lft rgt level
-------------------------------------------------------------------------------------------------------------------
08adf337-a577-4038-86a6-a5cd16676dff    0                                       ELECTRONICS             1   20  0
20150966-bbc5-438f-b3eb-1ff0bbc71b8b    08adf337-a577-4038-86a6-a5cd16676dff    TELEVISIONS             2   9   1
3fb68583-b9f3-4996-86fa-897c825767e4    20150966-bbc5-438f-b3eb-1ff0bbc71b8b    TUBE                    3   4   2
bca4d77f-9f6f-41da-ad66-e747edcb9482    20150966-bbc5-438f-b3eb-1ff0bbc71b8b    LCD                     5   6   2
9726c8ff-7664-4494-bb2f-3b365e7a6743    20150966-bbc5-438f-b3eb-1ff0bbc71b8b    PLASMA                  7   8   2
576a2266-9f11-4430-b81f-2ac2a536ad9a    08adf337-a577-4038-86a6-a5cd16676dff    PORTABLE ELECTRONICS    10  19  1
062921a4-e9af-48f6-adba-d623ca2de4ae    576a2266-9f11-4430-b81f-2ac2a536ad9a    MP3 PLAYERS             11  14  2
3a80ae89-5eba-4407-819c-944e1d360ed9    062921a4-e9af-48f6-adba-d623ca2de4ae    FLASH                   12  13  3
0a03f267-8646-4460-bce7-dc6993e337a3    576a2266-9f11-4430-b81f-2ac2a536ad9a    CD PLAYERS              15  16  2
fc9a25d0-a67a-4753-aed8-c148c9c95573    576a2266-9f11-4430-b81f-2ac2a536ad9a    2 WAY RADIOS            17  18  2
Я включил полный вывод кода sql ниже, если вам нужно добавить его в вашу базу данных.
Вот полный код sql. :

Код: Выделить всё

------------------------
MySQL categories.sql
------------------------

SET NAMES utf8mb4;

DROP TABLE IF EXISTS `categories`;
CREATE TABLE `categories`  (
`categoryId` char(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`parentId` char(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`lft` int NOT NULL,
`rgt` int NOT NULL,
`level` int NULL DEFAULT NULL,
PRIMARY KEY (`categoryId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

INSERT INTO `categories` VALUES ('062921a4-e9af-48f6-adba-d623ca2de4ae', '576a2266-9f11-4430-b81f-2ac2a536ad9a', 'MP3 PLAYERS', 11, 14, 2);
INSERT INTO `categories` VALUES ('08adf337-a577-4038-86a6-a5cd16676dff', '0', 'ELECTRONICS', 1, 20, 0);
INSERT INTO `categories` VALUES ('0a03f267-8646-4460-bce7-dc6993e337a3', '576a2266-9f11-4430-b81f-2ac2a536ad9a', 'CD PLAYERS', 15, 16, 2);
INSERT INTO `categories` VALUES ('20150966-bbc5-438f-b3eb-1ff0bbc71b8b', '08adf337-a577-4038-86a6-a5cd16676dff', 'TELEVISIONS', 2, 9, 1);
INSERT INTO `categories` VALUES ('3a80ae89-5eba-4407-819c-944e1d360ed9', '062921a4-e9af-48f6-adba-d623ca2de4ae', 'FLASH', 12, 13, 3);
INSERT INTO `categories` VALUES ('3fb68583-b9f3-4996-86fa-897c825767e4', '20150966-bbc5-438f-b3eb-1ff0bbc71b8b', 'TUBE', 3, 4, 2);
INSERT INTO `categories` VALUES ('576a2266-9f11-4430-b81f-2ac2a536ad9a', '08adf337-a577-4038-86a6-a5cd16676dff', 'PORTABLE ELECTRONICS', 10, 19, 1);
INSERT INTO `categories` VALUES ('9726c8ff-7664-4494-bb2f-3b365e7a6743', '20150966-bbc5-438f-b3eb-1ff0bbc71b8b', 'PLASMA', 7, 8, 2);
INSERT INTO `categories` VALUES ('bca4d77f-9f6f-41da-ad66-e747edcb9482', '20150966-bbc5-438f-b3eb-1ff0bbc71b8b', 'LCD', 5, 6, 2);
INSERT INTO `categories` VALUES ('fc9a25d0-a67a-4753-aed8-c148c9c95573', '576a2266-9f11-4430-b81f-2ac2a536ad9a', '2 WAY RADIOS', 17, 18, 2);
После запуска кода sql вам может потребоваться получить все дерево категорий:
Код sql, который извлекает все дерево.

Код: Выделить всё

SELECT c.name, c.parentId, c.lft, c.rgt, c.level
FROM
categories c
WHERE
c.lft BETWEEN c.lft AND c.rgt
GROUP BY
c.name
ORDER BY
c.lft;
Пример вывода кода выше:

Код: Выделить всё

+-----------------------+
| name                  |
+-----------------------+
| ELECTRONICS           |
|  TELEVISIONS          |
|   TUBE                |
|   LCD                 |
|   PLASMA              |
|  PORTABLE ELECTRONICS |
|   MP3 PLAYERS         |
|    FLASH              |
|   CD PLAYERS          |
|   2 WAY RADIOS        |
+-----------------------+
Ссылка: https://mikehillyer.com/articles/managi ... -in-mysql/

Подробнее здесь: https://stackoverflow.com/questions/790 ... ray-output
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»