PHP – Cum se construiește o listă cu structură arborescentă? (Programare, Php, Recursivitate, Copac, Structură)

Vaiman Hunor a intrebat.

Deci, problema mea este că vreau să construiesc un arbore din aceste 2 tabele:

Parent table:
+-------+---------------+
| pr_id |  parent_name  |
+-------+---------------+
|   1   |       p       |
|   2   |      p_0      | 
|   3   |     p_0_1     | 
|   4   |       q       | 
+-------+---------------+

Child table:
+-------+---------------+---------------------------+
| ch_id |     pr_id     |        child_name         |
+-------+---------------+---------------------------+
|   1   |       1       |            p_0            |
|   2   |       1       |            p_1            |
|   3   |       2       |           p_0_0           |
|   4   |       2       |           p_0_1           |
|   5   |       3       |          p_0_1_0          |
|   6   |       3       |          p_0_1_1          |
|   7   |       4       |            q_0            |
|   8   |       4       |            q_1            |
+-------+---------------+---------------------------+

Iar Arborele ar trebui să arate așa:

  • p
    • p_0
      • p_0_0
      • p_0_1
        • p_0_1_0
        • p_0_1_1
  • q

Mă poate ajuta cineva cu o soluție recursivă???

Comentarii

  • Ați încercat ceva????? –  > Por Anshul.
  • Am încercat să explodez numele părintelui și al copilului la caracterele „_” și, după aceea, să verific dacă al doilea sau al treilea element al matricei explodate este setat. Dar este o mare încurcătură. –  > Por Vaiman Hunor.
1 răspunsuri
Veerendra

Nu este nevoie să creați 2 tabele în baza de date pentru acest lucru, puteți să îl mențineți ca mai jos de la o singură tabelă

+-------+---------------+---------------------------+
|   id  |   parent_id   |           title           |
+-------+---------------+---------------------------+
|   1   |       0       |   Parent Page             |
|   2   |       1       |   Sub Page                |
|   3   |       2       |   Sub Sub Page            |
|   4   |       0       |   Another Parent Page     |
+-------+---------------+---------------------------+

Matricea generată va fi de genul

Array
(
    [0] => Array
        (
            [id] => 1
            [parent_id] => 0
            [title] => Parent Page
            [children] => Array
                        (
                            [0] => Array
                                (
                                    [id] => 2
                                    [parent_id] => 1
                                    [title] => Sub Page
                                    [children] => Array
                                                (
                                                    [0] => Array
                                                        (
                                                            [id] => 3
                                                            [parent_id] => 1
                                                            [title] => Sub Sub Page
                                                        )
                                                )
                                )
                        )
        )
    [1] => Array
        (
            [id] => 4
            [parent_id] => 0
            [title] => Another Parent Page
        )
)

Trebuie să folosiți funcția recursivă de mai jos pentru a o realiza

function buildTree(array $elements, $parentId = 0) {
    $branch = array();

    foreach ($elements as $element) {
        if ($element['parent_id'] == $parentId) {
            $children = buildTree($elements, $element['id']);
            if ($children) {
                $element['children'] = $children;
            }
            $branch[] = $element;
        }
    }

    return $branch;
}

$tree = buildTree($rows);

Algoritmul este destul de simplu:

  1. Luați matricea tuturor elementelor și id-ul părintelui curent (inițial 0/nimic/null/ceva).
  2. Faceți o buclă prin toate elementele.
  3. Dacă parent_id-ul unui element se potrivește cu id-ul părintelui curent pe care l-ați obținut la punctul 1, elementul este un copil al părintelui. Puneți-l în lista de copii actuali (aici: $branch).
  4. Apelați funcția în mod recursiv cu id-ul elementului pe care tocmai l-ați identificat în 3., adică găsiți toți copiii acelui element și adăugați-i ca element copil.
  5. Returnați lista copiilor găsiți.

Comentarii

  • Și cum aș putea tipări această structură sub formă de listă? –  > Por Vaiman Hunor.
  • @VaimanHunor Poți să faci o buclă prin matricea creată sau poți folosi funcția și să scrii codul de tipărire în interiorul funcției. –  > Por Veerendra.