joeker
Goto Top

Umstrukturierung eines Arrays anhand einer rekursiven Funktion umstrukturieren

Hallo,

ich u.a. folgende Arrays in einer (ziemlich flachen) Hierarchie:

Array1:
Array(
[4042] => Array
(
[level2] => 10
[level3] => 78
[level4] => 159
)
[4043] => Array
(
[level2] => 10
[level3] => 78
[level4] => 158
)
[4046] => Array
(
[level2] => 10
[level3] => 87
[value] => 5
)
)

Array2:
Array
(
[3791] => Array
(
[level2] => 23
[level3] => 135
[level4] => 171
)
[3792] => Array
(
[level2] => 23
[level3] => 135
[level4] => 172
)
)

Array3:
Array
(
[45125] => Array
(
[level2] => 34
[level3] => 139
[level4] => 175
[value] => test
)
[45126] => Array
(
[level2] => 34
[level3] => 139
[level4] => 176
[value] => test123
)
)

Wie kann ich anhand einer Funktion schaffen die einzelnen Levels (1-4) in eine tiefe Hierarchie umzudwandeln?
D.h. zB für Array1:
[4042] => Array
(
10 => Array(78 => Array(159, 158), 87 => 5)
)
)
Array2:
[3791] => Array
(
23 => Array(135 => Array(171, 172))
)
Array3:
[45125] => Array
(
34 => Array(139 => Array(175 => "test", 176 => "test123"))

)

Es geht darum das Array möglichst zu klein zu halten und die doppelten Werte "rauszuschmeißen".
Wäre es mit einer rekursiven Funktion möglich so etwas dynamisch zu generieren?

Content-Key: 289223

Url: https://administrator.de/contentid/289223

Printed on: April 24, 2024 at 09:04 o'clock

Member: Dirmhirn
Dirmhirn Nov 24, 2015 at 13:12:45 (UTC)
Goto Top
Hi,

bin mir nicht sicher ob dein 4042-Array überhaupt konsistent ist.

Sieht aus wie ein Tree. kannst mal nach compressing Tree o.ä. suchen. Vll findest du was fertiges.

Sonst ja, rekursiv muss das auch gehen: Vergleich die Werte das ersten Levels. Für jeden Unique-Wert rufst du das ganze fürs nächste Level auf. Wenn du das letzte Array-Element erreicht hast, dann ist's fertig.

Wieso willst du das ganze umbauen?

sg Dirm
Member: joeker
joeker Nov 24, 2015 at 13:25:43 (UTC)
Goto Top
Es geht um ein Projekt, an dem ich arbeite. Nun bin ich mit meiner DB-Abfrage auf das Resultat gestoßen und jetzt muss ich es für eine bestimmte Ansicht optimieren.
Ich versuch mal mit der Recherche nach "compressing Tree" weiter zu kommen.

Es stimmt - das mit dem 4042-Array - so sollte es normalerweise aussehen:
10 => Array(78 => Array(159, 158)), array(87 => 5))
Member: joeker
joeker Nov 24, 2015 at 14:35:38 (UTC)
Goto Top
Nach einiger Recherche und vielen gescheiterten Versuchen hab ich leider mein Resultat nicht erreichen können.
Könntest du ggf. anhand eines Pseudocodes mir zeigen, wie ich den Anfang machen könnte?
Mit rekursiven Funktionen hab ich leider zu wenig Erfahrungen. face-sad
Member: Larmina
Solution Larmina Dec 14, 2015 updated at 18:13:42 (UTC)
Goto Top
Hallo Joeker,
probiers mal mit Array_walk_recursive
php.net/manual/de/function.array-walk-recursive.php
Wenn du die Arraykeys auch brauchst ist es nicht geeignet, aber wenn du nur die Werte brauchst müsste es gehen.
Dann schnappst du dir in deiner Funktion die Arraywerte und schreibst sie ins tiefe Array.

LG Larmina
Member: joeker
joeker Dec 14, 2015 at 18:14:46 (UTC)
Goto Top
Danke Larmina,
Aber ich hab bereits eine andere Lösung gefunden, wo ich keine rekursive Funktion benötige ;)