2017-10-05 1 views
0

Ich möchte einen Wert berechnen, der von unten nach oben übertragen wird.Wie rekursiv berechnen von unten nach oben mit PHP?

enter image description here

Zum Beispiel aus dem Bild oben, habe ich diesen Zustand A, B, C, D, E unter Brunei Land, dass jeder Nennwert von 6,4,4,3,3 haben.

Um den Wert zu berechnen, muss ich den gesamten Wert plus und dividieren durch die Anzahl der Zustände.

(6 + 4 + 4 + 3 +3)/5 = 4

Der Bewertungswert nur auf der Ebene vorhanden, und nach berechnen wird es zu seiner Mutter bringen wird, werden summierte und dividiert durch die Anzahl der Kinder.

Meine aktuelle Lösung verwenden geschachtelte for-Schleife, aber es funktioniert nur, wenn ich die genaue Tiefe der Hierarchie kenne. Wenn ich also WORLD zu einem Kind des PLANETS hinzufüge, muss ich manuell eine weitere geschachtelte For-Schleife hinzufügen, um die Bewertung zu berechnen, die nicht sehr elegant ist. Ich möchte die aktuelle Lösung in eine dynamischere Lösung umwandeln.

Blank Funktion:

function getRating($place_id){ 
    //do other things 
    //get ratings from all states in the country, summed and divide by the number of states 
    //return result of average rating 
} 


$world_id = 1; 
$asia_id = 3; 
$brunei_id = 7; 

getRating($world_id); 
//expected result : 5 

getRating($asia_id); 
//expected result : 4 

getRating($brunei_id); 
//expected result : 4 

Aktuelle Lösung:

//calculate continent rating 

      foreach ($subcontinents as $key => $subcontinent) { 

       //calculate sub-continent rating 

       foreach ($countries as $key => $country) { 

        //calculate country ratings 

        $rating_count = sizeof($state_ratings); 

        $total_country_achievement = 0; 

        foreach ($state_ratings as $key => $state_rating) { 

         $total_rating_achievement = 0;  
         $state_achievement = $state_rating->value; 

         $total_rating_achievement = $total_rating_achievement + $state_achievement; 

        } 

        $total_country_achievement = $total_rating_achievement/$rating_count; 

       }    

      } 
+1

Können Sie hinzufügen ein 'var_dump()' der Eingabedaten? Und warum gibt es einen fest codierten Variablenwert in Ihrer inneren Schleife? – jeroen

+0

@jeroen hi der harcode möchte nur den rating value zeigen, für var_dump() kann ich tatsächlich den Wert bekommen, den ich mit der obigen Beispiellösung haben möchte, aber es ist nicht sehr elegant, da ich manuell eine weitere for-Schleife hinzufügen muss ist andere Eltern existieren –

+0

Was ist Ihr erwarteter Wert? Suchen Sie nach $ total_country_achievement für ein bestimmtes Land oder nach einem Array aller Länderwerte oder nach dem Weltwert oder dem gesamten Baum? –

Antwort

0

Sie sollten eine rekursive Funktion tun, den Baum zu durchqueren, um den Durchschnittswert für jede Ebene zu berechnen. So etwas (passen Sie sich an Ihre eigenen Bedürfnisse an). diese

function getValueOfLeaf($node) { 
    if (is_array($node)) { 
     $sum = 0; 
     foreach ($node as $key => $value) { 
      $sum += getValueOfLeaf($value); 
     } 
     return $sum/sizeof($node); 
    } else { // not an array 
     return (int) $node; 
    } 
} 

Um ein Land Wert oder einen Kontinent Wert zu erhalten, tun:

getValueOfLeaf($planet['earth']['asia']['south-east-asia']['brunei']; // get brunei states average 
getValueOfLeaf($planet['earth']['europe']); // get average value of all country averages in Europe 
getValueOfLeaf($planet['earth']); // get average for earth 
0

Machen Sie rekursiv wie diese

<?php 
    $arr = [ 
     5, 
     [[10,[6,4,4,3,3],5,5],4,2], 
     6 
    ]; 
    function getAvg($arr){ 
     foreach ($arr as $key => &$value) { 
      if(is_array($value)){ 
       $value = getAvg($value); 
      } 
     } 
     $avg = array_sum($arr)/count($arr); 
     echo "\nAverage of : ".implode(", ", $arr)." => ".$avg; 
     return $avg; 
    } 
    $avg = getAvg($arr); 
    echo "\nAverage of all is : ".$avg; 
?> 

Live-Demo-Funktion: https://eval.in/874201

+0

Hallo, vielleicht missverstehe ich deinen Code, aber nur der Wert 6,4,4,3,3 ist die genaue Bewertung, andere ist der Durchschnitt von diesem Wert und tragen oben, und weiterhin durchschnittlich für jedes Kind –

+0

@NediSidi: ja das ist genaue Array-Form Sie zeichnen – C2486

+0

@NediSidi: oder teilen Sie Ihre PHP-Array Daten Beispiel? – C2486

Verwandte Themen