Какова наилучшая практика для обработки произвольной глубины в массивах?

У меня есть набор данных:

id | name     | parentid
------------------------
1  | parent   | 0
2  | child    | 1
3  | child    | 1
4  | parent   | 0
5  | child    | 4
6  | subchild | 5
7  | child    | 4

Что я могу сопоставить с иерархией, которая выглядит следующим образом:

1   parent   
2   |-- child    
3   |-- child    
4   parent   
5   |-- child    
6       |-- subchild 
7   |-- child    

В настоящий момент я использую рекурсивную функцию, которая проверяет наличие дочерних элементов, но это очень медленно.

function dothings(currentid) {
  //do stuff for item

  //check if anything has a parentid of currentid
  if (let children = checkforchildren(currentid) > 0) {
    foreach(children as child) {
      dothings(child['id']);
    }
  }
}

Существует ли наилучшая практика при работе с данными, которые нужно отображать в произвольно глубокий массив?

(Если это имеет значение, я использую MySQL и PHP для этого. Я могу предоставить больше информации, характерной для моего варианта использования, если это необходимо, но я ищу здесь наилучшую практику, а не только оптимизацию отладки .) суб>

3 голоса | спросил amflare 23 PMpMon, 23 Apr 2018 19:00:56 +030000Monday 2018, 19:00:56

1 ответ


3

Просто потому, что данные хранятся в одном формате, это не значит, что вы должны держать его в памяти в этом формате. Как правило, для древовидной структуры, а не для использования массива, она будет храниться как дерево. У каждого родительского узла будет список дочерних узлов. Это устраняет необходимость поиска всех узлов, чтобы выяснить, какие из них имеют родителя, с которым вы сейчас работаете. Таким образом, данные будут выглядеть примерно так:

id | name     | children
------------------------
 1 | parent   | 2, 3
 2 | child    | 0
 3 | child    | 0
 4 | parent   | 5, 7
 5 | child    | 6
 6 | subchild | 0
 7 | child    | 0

Теперь ваш цикл становится

function dothings(currentid) {
  //do stuff for item

  foreach(children as child) {
      dothings(child['id']);
  }
}

Мы удалили линейный поиск всех узлов, чтобы найти дочерние элементы каждого узла.

ответил user1118321 25 AMpWed, 25 Apr 2018 08:23:21 +030023Wednesday 2018, 08:23:21

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132