Array ändern/editieren mit Rekursion

Hallihallo Community,

ich melde mich zurück. Ich weiß, ich hab ein ähnliches Thema bereits eröffnet, aber dieses ist doch soweit verschiedenen von meinem Ehemaligen, das ich mich entschlossen habe ein neues aufzumachen.

Nunja, erstmal habe ich ein paar Fragen. Da ich grade keinen PHP parser zu Hand habe, kann ich euch keinen korrekten PHP Code garantieren.

Betrachtet einmal folgendes Array:
PHP:
$array =
Code:
Array
(
    [0] => Array
        (
            [num] = 1
            [subcat] => Array
                (
                    [0] => Array
                        (
                            [num] => 2
                            [subcat] => Array
                            (
                             [0] => Array
                                 (
                                       [num] => 2
                                )
                             [1] => Array
                                 (
                                       [num] => 2
                                 )
                        )
                )
        )
)
So, jetzt muss ich erstmal sagen, was ich haben will:
Das Array soll rekursiv durchlaufen werden, da das Array beliebig groß werden kann. Nun sollen alle num-Einträge einer Unterkategorie addiert werden und ihrem Vater übermittelt werden.

Am Beispiel oben wäre das in einem Ausschnitt:
Code:
[0] => Array
                        (
                            [num] => 2 + (2 + 2)   <--- aus beiden Einträgen unten
                            [subcat] => Array
                            (
                             [0] => Array
                                 (
                                       [num] => 2 <----
                                )
                             [1] => Array
                                 (
                                       [num] => 2 <---
                                 )
                        )
Und das soll jetzt für alle Unterkategorien also "subcat" passieren, sodass der Übervater, d.h. der Vater der keine Unterkategorie ist, die Summe aller num Einträge seiner Unterkategorien besitzt.

Bisher verstanden? Ich weiß es klingt jetzt danach, dass ich euch das machen las, damit ich nichts zu tun hab, aber ich möchte betonen, dass dies nicht so ist.

So, mein Vorschlag war, das Array rekursiv zu durchlaufen und die num Einträge zu addieren und die dann alle auf den Vater['num'] Eintrag zu addieren.

Das Problem das ich hatte war, dass ich das Array überhaupt nicht änder konnte: Beispiel:
PHP:
 function numberpropagate($array) {
           if(is_array($array)) {
                 foreach($array as $index => $value) {
                         if(is_array($value['subcat'])) {
                            numberpropagate($value['subcat']);
                          }
                         else {
                          // Alle Einträge summieren und dem Vater übermitteln
                          $num = sumnum($array); // sumnum ist eine Funktion die dies macht
                          
                          // Num bei dem Vater eintragen
                          $vater['num'] = $num + $vater['num'];

                         // Wo bekomm ich den Vater her? Eine Referenzarray übergeben?
                         }
                  }
           }

return $array;
}

Ich sehe selbst grade, dass ich garnicht dem Vater diesen num Eintrag geben sondern dem Unterarray selbst. Bei früheren Tests hatte ich aber auch ähnliche Probleme, dass ich das Array so nicht bearbeiten konnte.

Ich habe bereits in mehreren Foren gelesen, dass man um ein Array, das man rekursiv durchläuft, am besten editieren kann, wenn man es als Referenz definiert.
Also
PHP:
function numberpropagate(&$array)
oder sowas in der Art.
Kann mir jemand sagen, ob dies bei mir helfen könnte?

Auch bin ich auf die Funktion array_walk und array_walk_recursive gestoßen. Diese könnten mir in meinem Problem auch weiterhelfen, konnte dies aber auch noch nicht ausgiebig testen.

Also wenn mir irgendjemand helfen könnte, wäre ich demjenigen sehr verbunden!

Vielen, vielen Dank!

PS: Ich poste solche Sachen nicht auf der Jobbörse, da ich und ihr sicherlich auch was davon lernen könnt! ;-]

Vielen Dank fürs Lesen nochmal! :)
 
PS: Ich poste solche Sachen nicht auf der Jobbörse, da ich und ihr sicherlich auch was davon lernen könnt!
Neja, sowas lernt man in der Schule wenn 's um Programmieren geht. Zumindest in NRW am Gym.

Was auch immer du mit deinen Arrays vor hast du bist ganz dicht an Listen und Bäumen. Dazu solltest du mal etwas lesen und keine Angst vor Artikeln die für Java sind. Dabei werden nur Objekte, statt Arrays verwendet.
Eine solche Funktion zum aufsummieren der einzelnen Bestandteile gibt es dort auch oft und hier habe ich mal eine leicht geändert und auf deine Situation angepasst:
PHP:
function TreeSum(&$a)
{
	$summe = 0;
	$summe += $a["num"];
	if ($a["subcat"])
	{
		foreach ($a["subcat"] as $aTmp)
		{
			$summe += TreeSum($aTmp);
		}
	}
	$a["num"] = $summe;
	return $summe;
}

// Testen und Ausgabe
TreeSum($a[0]["subcat"][0]);
var_dump($a[0]["subcat"][0]);

Erzeugt:
Code:
array(2)
{
  ["num"]=> int(6)
  ["subcat"]=> array(2)
  {
    [0]=> array(1)
    {
      ["num"]=> int(2)
    }
    [1]=> array(1)
    {
      ["num"]=> int(2)
    }
  }
}
 
Zuletzt bearbeitet:
Hallo!

Vielen Dank für deine Hilfe!
Es scheint zu klappen, nur bin ich etwas verwirrt. Warum gibt er mir das korrekte Ergebnis bei var_dump($test) aus und nicht bei print_r. Bei Letzterem wird lediglich das Ursprungsarray ausgegeben.

Vielen, vielen Dank!
 
Zuletzt bearbeitet:
Code:
Array
(
    [id] => 11
    [name] => test
    [num] => 5 <--(ursprünglich 2)
    [subcat] => Array
        (
            [0] => Array
                (
                    [id] => 12
                    [name] => Test Category SUB 2
                    [num] => 1 <--- gleich geblieben
                    [subcat] => Array
                        (
                            [0] => Array
                                (
                                    [id] => 14
                                    [name] => Drubb
                                    [num] => 1
                                    [subcat] => 
                                )

                            [1] => Array
                                (
                                    [id] => 17
                                    [name] => JOchen pEt
                                    [num] => 1
                                    [subcat] => 
                                )

                        )

                )

        )

)

Dieses Array wird nur zum Teil korrekt bearbeitet. Der Übervater wird geupdated, aber die Kinder bleiben im num gleich, obwohl sie sich auch updaten sollen.
Was muss ich deinem Skript ändern, damit diese wirklich auch geändert werden?

Zum Beispiel wenn ich deine Funktion abänder:
PHP:
			function TreeSum(&$a)
			{
			    $summe = 0;
			    $summe += $a["num"];
			    if ($a["subcat"])
			    {
			        foreach ($a["subcat"] as $aTmp)
			        {
			            $summe += TreeSum($aTmp);
			        }
			    }
			    $a["num"] = $summe;
			    $a["test"] = 1; //<--- ZUR DEMONSTRATION
// in der Fatherkategorie sollte dies erscheinen, tut es aber nicht. Beispiel: Test Category SUB 2
			    return $summe;
			}
Es soll einfach immer ein $a["test"] = 1 angehängt werden.
Leider bekomm ich folgendes:
Code:
Array
(
    [id] => 11
    [name] => test
    [num] => 5
    [subcat] => Array
        (
            [0] => Array
                (
                    [id] => 12
                    [name] => Test Category SUB 2
                    [num] => 1
                    [subcat] => Array
                        (
                            [0] => Array
                                (
                                    [id] => 14
                                    [name] => Drubb
                                    [num] => 1
                                    [subcat] => 
                                )

                            [1] => Array
                                (
                                    [id] => 17
                                    [name] => JOchen pEt
                                    [num] => 1
                                    [subcat] => 
                                )

                        )

                )

        )

    [test] => 1
)

Manchmal versteh ich die Arraywelt nicht.
 
Zuletzt bearbeitet:
Zurück