dmtrbskkv
@dmtrbskkv
Кодим и декодим, а иногда кино смотрим

Как организовать объединение элементов массива, которые сами являются массивами?

Есть большой входной массив состоящий из несколько массивов, подобного формата:
id => ...
children => ...
meta => ...

Поле children содержит дочерние id объектов в этом же массиве.
По итогу, несколько элементов массива должны объединиться в массив из самих себя, а остальные остаться как есть.

Главная проблема в кол-ве элементов. Плюс, не получается удалить лишние элементы, которые уже скопированы. Если заводить несколько массивов, то выдается ошибка о нехватке памяти. Получается, нужно использовать максимум 1 большой массив.

Есть у кого-нибудь идеи/варианты реализации подобного?

Ещё раз. Изначально массив такой:
[
 [
  id => ...
  children => ... 
  meta => ...
 ],
 [
  id => ...
  children => ... 
  meta => ...
 ],
 [
  id => ...
  children => ... 
  meta => ...
 ],
...
]
  • Вопрос задан
  • 166 просмотров
Решения вопроса 1
Общая схема:
Web Browser (Client) <-----А-----> Server <------Б----> DB (SQL)

А (и данных не много):
На клиент данные можно передавать плоским списком, т.е. массивом как у вас.
Клиент строит дерево самостоятельно.

Б:
В БД записей может быть очень много, передавать их все серверу НЕ НУЖНО, он рано или поздно ляжет, и ляжет сеть по которой эти данные будут передваться.
Фильтрацию данных почти в любом случае должен делать SQL сервер на своей стороне, он для этого оптимизирован.

Записи в БД можно хранить как плоский список.
-id
-parentId
-...

И еще одна таблица для иерархии (с помощью этой таблицы мы избавляемся от рекурсии, но это добавляет сложности на поддержание этой таблицы в актуальном состоянии):
-id_предок
-id_потомок

Запрос - например, дай мне всех потомков для записи с id = 2, делаем запрос в таблицу иерархии и достаем все Id_потомки у которых есть предок с Id=2. Так можно очень легко доставать записи любого уровно вложенности, и спокойно гулять вниз-вверх.

Если запрос тяжелый, то можно использовать представление (View), представление можно сделать материализованным (т.е. будет создана таблица с ее результатами, и она сама будет поддерживаться в актуальном состоянии при обновлении исходных таблиц. Но это накладные расходы).

Немного не по теме:
Мы на одном проекте как то делали фолдеры с файлами доступными через Web. Я как раз занимался хранением дерева в БД, и отслеживанием всех операций (копирование, перемещение, удаление). На фронте той же темой на Angular. Там 3 кейса нужно отследить в итоге нужно всего - узел пермещается в root; узел из root перемещается в дочерний узел; узел перемещается из одного дочернего узла в другой.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
По итогу, несколько элементов массива должны объединиться в массив из самих себя,
Рекурсивная обработка (с проставлением разделителя).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы