Qual è la procedura migliore per gestire la mappatura della profondità arbitraria negli array?

3

Ho un set di dati:

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

Che posso mappare a una gerarchia che assomiglia a:

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

Al momento, sto usando una funzione ricorsiva che controlla i bambini, ma questo è molto lento.

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']);
    }
  }
}

Esiste una best practice quando si lavora con dati che devono essere mappati in un array arbitrariamente profondo?

(Se è importante, sto usando MySQL e PHP per gestirlo. Posso fornire più informazioni specifiche per il mio caso d'uso, se necessario, ma sto cercando una best practice qui, non solo il debugging di ottimizzazione .)

    
posta amflare 23.04.2018 - 18:00
fonte

1 risposta

3

Solo perché i dati sono archiviati in un formato non significa che devi tenerli in memoria in quel formato. Generalmente per una struttura ad albero, piuttosto che usare un array, verrebbe memorizzato come un albero. Ogni nodo genitore avrebbe una lista di nodi figli. Ciò elimina la necessità di cercare tutti i nodi per capire quali hanno il genitore con cui stai attualmente lavorando. Quindi i dati sarebbero simili in memoria:

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

Ora il tuo loop diventa

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

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

Abbiamo rimosso la ricerca lineare di tutti i nodi per trovare i figli di ciascun nodo.

    
risposta data 25.04.2018 - 07:23
fonte

Leggi altre domande sui tag