Breadcrumb van een array met eindeloze subcats met subcats

Pagina: 1
Acties:
  • 432 views

Vraag


Acties:
  • 0 Henk 'm!

  • Bielie993
  • Registratie: Maart 2010
  • Laatst online: 21-03 21:05
Mijn vraag
Ik kan redelijk programmeren, maar ik kom niet uit onderstaande dilemma:

Ik wil van een array waarin staat wat de parent is, uitzoeken wat het pad is (breadcrumb) en dit vervolgens voor elk item erbij opslaan. Oftewel terugherleiden of die parent ook een parent had etc, etc.

Het is om een boomstructuur te vullen met informatie wat kan relateren aan andere informatie, wat dan weer relateert aan andere informatie. Om dit eenvoudig voor de gebruiker te maken wil ik in een keuze menu laten zien wat het exact pad is voor je hem koppelt als 'ouder'.


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
$array = [
            [
                'id' => 1,
                'Title' => 'Main Menu 1',
                'parent' => null
            ],
            [
                'id' => 2,
                'Title' => 'Main Menu 2',
                'parent' => null
            ],
            [
                'id' => 3,
                'Title' => 'Sub menu 1',
                'parent' => 2
            ],
            [
                'id' => 4,
                'Title' => 'Sub menu 2',
                'parent' => 3
            ],
            [
                'id' => 5,
                'Title' => 'Main Menu 3',
                'parent' => 3
            ]
        ];

        /*
        Expected behaviour:

             [
                'id' => 1,
                'Title' => 'Main Menu 1',
                'breadcrumb' => 'Main Menu 1',
                'parent' => null
            ],
            [
                'id' => 2,
                'Title' => 'Main Menu 2',
                'breadcrumb' => 'Main Menu 2',
                'parent' => null
            ],
            [
                'id' => 3,
                'Title' => 'Sub menu 1',
                'breadcrumb' => 'Main Menu 2 \ Sub menu 1',
                'parent' => 2
            ],
            [
                'id' => 4,
                'Title' => 'Sub menu 2',
                'breadcrumb' => 'Main Menu 2 \ Sub menu 1 \ Sub menu 2',
                'parent' => 3
            ],
            [
                'id' => 5,
                'Title' => 'Main Menu 3',
                'breadcrumb' => 'Main Menu 2 \ Sub menu 1 \ Sub menu 3',
                'parent' => 3
            ]

        */



Relevante software en hardware die ik gebruik
PHPStorm
Laravel 6

Wat ik al gevonden of geprobeerd heb
Ik ben al aan het stoeien geweest met recursieve functies, maar ik kom er niet uit. Ik hoop dat iemand mij op de goede richting kan helpen.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
    public function getTopicsEnum(Request $request)
    {
        $helpTopics = HelpTopics::get();

        $array = [];
        foreach ($helpTopics as $helpTopic) {
            $topic['Help_TopicID'] = $helpTopic->Help_TopicID;
            $topic['Ouder'] = $helpTopic->Ouder;
            $topic['Titel'] = $helpTopic->Titel;
            $topic['Breadcrumb'] = $helpTopic->parent ? $this->getBreadcrumbForTopic($helpTopic, $helpTopics) : null;
            $array[] = $topic;
        }
        dd($array);
    }

    private function getBreadcrumbForTopic($helpTopic, Collection $helpTopics, $breadCrumb = null)
    {
        $foundTopic = $helpTopics->where('Help_TopicID', $helpTopic->Help_TopicID)->first();
        if (!$foundTopic) {
            return null;
        }
        if (is_null($breadCrumb)) {
            $breadCrumb = $foundTopic->Titel;
        } else {
            $breadCrumb .= ' / ' . $foundTopic->Titel;
        }

        if ($foundTopic->parent) {
            $breadCrumb = $this->getBreadcrumbForTopic($foundTopic, $helpTopics, $breadCrumb);
        }

        return $breadCrumb;
    }

[ Voor 228% gewijzigd door MueR op 24-12-2021 23:31 ]

Alle reacties


Acties:
  • 0 Henk 'm!

Anoniem: 1302638

wat heb je al geprobeerd dan?

Acties:
  • 0 Henk 'm!

  • Bielie993
  • Registratie: Maart 2010
  • Laatst online: 21-03 21:05
Heb het even in het topic erbij gezet.

[ Voor 130% gewijzigd door Bielie993 op 24-12-2021 22:31 ]


Acties:
  • 0 Henk 'm!

  • Masvic
  • Registratie: Juli 2011
  • Laatst online: 12-05 13:04
Dit soort verbanden leg je m.b.v. een tree https://www.geeksforgeeks.org/binary-tree-data-structure/

Acties:
  • 0 Henk 'm!

  • tafkaw
  • Registratie: December 2002
  • Laatst online: 11-05 12:14

Acties:
  • 0 Henk 'm!

  • Bielie993
  • Registratie: Maart 2010
  • Laatst online: 21-03 21:05
Ik heb het inmiddels gevonden, er ging een beleltje rinkelen. Ga ook eens kijken naar jullie tips, misschien is het daarmee nog makkelijker:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    public function getTopicsEnum(Request $request)
    {
        $helpTopics = HelpTopics::get();
        $helpTopicsArray = [];
        foreach ($helpTopics as $helpTopic) {
            $topic['Help_TopicID'] = $helpTopic->Help_TopicID;
            $topic['Ouder'] = $helpTopic->Ouder;
            $topic['Titel'] = $helpTopic->Titel;
            $topic['Breadcrumb'] = $helpTopic->parent ? implode(' / ', array_reverse($this->getBreadcrumbForTopic($helpTopic, $helpTopics))) . ' / ' . $helpTopic->Titel : $helpTopic->Titel;
            $helpTopicsArray[] = $topic;
        }
        return new JsonResponse($helpTopicsArray);
    }

    private function getBreadcrumbForTopic($helpTopic, Collection $helpTopics, $breadCrumbArray = []): ?array
    {
        $foundTopic = $helpTopics->where('Help_TopicID', $helpTopic->Ouder)->first();
        if (!$foundTopic) {
            return null;
        }
        $breadCrumbArray[] = $foundTopic->Titel;

        if ($foundTopic->parent) {
            $breadCrumbArray = $this->getBreadcrumbForTopic($foundTopic, $helpTopics, $breadCrumbArray);
        }
        return $breadCrumbArray;
    }

Resultaat
code:
1
2
3
4
5
6
    {
        "Help_TopicID": 15,
        "Ouder": 2,
        "Titel": "Klantkaart",
        "Breadcrumb": "Dashboard / Klanten / Klantkaart"
    },

[ Voor 198% gewijzigd door teacher op 25-12-2021 00:00 ]


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 13-05 10:16

MueR

Admin Tweakers Discord

is niet lief

Mooi. Maar je gaat niet zomaar je vraag weghalen als je een antwoord hebt.

Anyone who gets in between me and my morning coffee should be insecure.

Pagina: 1

Dit topic is gesloten.