Werte in Array schreiben

Hallo

ich möchte einen Verzeichnisbaum in ein Array einlesen.
Dies sollte verschachtelt funktionieren wie in dem Screenshot gezeigt passieren.

2020-01-14_11h14_52.png

Leider komme ich nicht weiter damit.

D.H. ich möchte den Baum als Array einlesen und dann vom Ende her nach oben zu rechnen.
Also z.B. der Summe oder Durchschnittswerte der Variablen.

Dies ist meine aktuelle Lösung
https://www.symcon.de/forum/threads/42516-Raumvariablen-standardisieren-%28Baumstruktur%29

Allerdings ist hier das Problem, dass alle Variablen beim nach oben Rechnen mehrmals aktualisieren.
Ich möchte die Werte einmal einlesen und einmal schreiben.

Das klingt nach einer klassischen Tiefen- oder Breitensuche. Mal eine schnelle ungetestete Implementation für Summe:


function Sum($objectID) {
  $sum = GetValue($objectID);
  foreach(IPS_GetChildren($objectID) as $childID) {
    $sum += Sum($childID);
  }
  return $sum;
}

Sum(12345); // Startpunkt definieren


Kleine Anpassung um alles auf ein Array zu setzen:


function toArray($objectID) {
  $result = [ $objectID ];
  foreach(IPS_GetChildren($objectID) as $childID) {
    $result = array_merge($result, toArray($childID));
  }
  return $result;
}

Sum(12345); // Startpunkt definieren


Du gehst also von deinem Startpunkt aus rekursiv in die Tiefe und rufst deine Funktion halt immer wieder auf. Beim Durchschnitt könnte man die Hauptfunktion so bauen, dass sie Summe und Knotenzahl zurückgibt. Daraus kannst du dann den Durchschnitt berechnen.

Vielen Dank für die schnelle Antwort. Ich glaube allerdings, ich habe mich etwas falsch ausgedrückt.

function toArray($objectID) {
  $result = [ $objectID ];
  
  foreach(IPS_GetChildrenIDs($objectID) as $childID) {
    $result = array_merge($result, toArray($childID));
  }
  return $result;
}

print_r (toArray(43481 /*[!! Listen Rechnen\Alles]*/)); 

Damit werden alle IDs flach in dem Array angezeigt.
Ich möchte die Werte aus der Variable „Ende“ nach oben in die Variablen schreiben und immer miteinander verrechnen.

Hier mal ein anders Beispiel

Ah, ich verstehe. Aber auch das kannst du nach gleichem Muster einbinden:



function bubbleUp($objectID) {
  $sum = 0;
  $count = 0;
  foreach(IPS_GetChildren($objectID) as $childID) {
    bubbleUp($childID);
    $sum += GetValue($childID);
    $count++;
  }
  if ($count > 0) {
    SetValue($objectID, $sum / $count);
  }
}

bubbleUp(12345); // Startpunkt definieren 

Perfekt das klappt mit ein paar Anpassungen perfekt.

So einfach kann es gehen. Hab einfach zu kompliziert gedacht.

Vielen Dank dir für deine Mühen

Gesendet von meinem VOG-L29 mit Tapatalk