2017-05-08 1 views
0

Ich habe ein Array, mit einer Struktur ähnlich der unten. Wo es eine Hierarchie istSumme hierarchisches Array für jede Ebene von Array/Hierarchie

[2] => Array 
     (
      [sumW] => 200.39 
      [child] => Array 
       (
        [3] => Array 
         (
          [sumW] => 300.00 
         ) 
        [4] => Array 
         (
          [sumW] => 100.28 
          [child] => Array 
           (
            [5] => Array 
             (
              [sumW] => 600 
             ) 

            [6] => Array 
             (
              [sumW] => 150 
             ) 

           ) 
         ) 

        [7] => Array 
         (
          [sumW] => 30.00 
          [child] => Array 
           (
            [8] => Array 
             (
              [sumW] => 100.00 
             ) 

           ) 
         ) 

       ) 
     ) 

``` 

Ich kann nicht herausfinden, wie auf jeder Ebene des Arrays jedes Array zu summieren. So dass jede Ebene die Summe von SICH SELBST UND die darunter liegenden Ebenen hat.

So zum Beispiel so etwas wie

[2] = [tot] => 1480.67 
[3] = [tot] => 300.00 
[4] = [tot] => 850.28 
    [5] = [tot] => 600.00 
    [6] = [tot] => 150.00 
[7] = [tot] => 130.00 
    [8] = [tot] => 100.00 

Und so weiter.

Das Array kann unendlich tief sein, dies zeigt nur 3 Ebenen, aber meine Hierarchie könnte tiefer als 3 Ebenen reichen.

Ich habe versucht, mit Array-Summe und mit der Einstellung Eltern/Kind-IDs in einem Array. Das Beste, was ich tun kann, ist die Werte für 2-> 3,4,7. Aber ich kann [2] keine Werte von [5] und [6] und darüber hinaus erhalten.

EDIT:

Hier ist ein Ansatz, den ich versucht. Ich habe parent_ids und category_ids aus meinen Rohdaten. Und das hat meine Summen 1 Level tief in jedem Level. Summiert aber nicht alles in der Hierarchie.

$tot=[]; 
$getSum = function ($array, $pid = null) use (&$getSum, &$tot) { 
      $rpt = new Report; 
      foreach ($array as $item) { 
     // This returns my database value for this category. 
       $sum = $rpt->getCategoryTotal($item->category_id); 

       if($item->parent_id == $pid) { 

        if(!isset($tot[$item->category_id])){ 
         $tot[$item->category_id] = $sum; 
        } 

        if(isset($tot[$item->parent_id])){ 
         $tot[$item->parent_id] += $sum; 
        } 

        $child = $getSum($item->children, $item->category_id); 
       } 
      }   
      return $sum; 
     }; 

$result = $getSum($myDbData); 
return dd($tot); 
+0

haben Sie versucht, einen Code zu schreiben? – B4NZ41

+0

@ B4NZ41 hinzugefügt einen Code, den ich ausprobiert habe – Nertskull

Antwort

0

Ich fand eine Lösung, die für mich zu arbeiten scheint. Habe es nicht gründlich getestet, aber es scheint so weit zu arbeiten.

 function setTotals($category) { 
     $category['totalW'] = $category['sumW']; 
     if (isset($category['child']) && is_array($category['child'])) { 
      $sub = []; 
      $i = 0; 
      foreach ($category['child'] as $cat) { 
       $sub[] = setTotals($cat); 
       $category['totalW'] += $sub[$i]['totalW']; 
       $i++; 
      } 
      $category['child'] = $sub; 
     } 
     return $category; 
    } 
    setTotals($myArray); 

Das auf der Array-Struktur in der Frage gepostet funktioniert, und fügt eine ‚Gesamt‘ Linie zu jeder Ebene, zusammen mit der Summe für diese Ebene, die Ebene.

Hoffentlich hilft das jemand anderem.

Kredit: Ich fand das hier, das mir geholfen hat, diese Arbeit zu machen. codepad

0

Ich denke über eine rekursive Funktion wie folgt aus:

public function recursiveSum(array $source) 
{ 
    $children = $source['child'] ?? []; 

    $sum = $source['sumW'] ?? 0; 

    foreach($children as $index => $child) 
    { 
     $source['child'][$index] = $this->recursiveSum($child); 
     $sum += $source['child'][$index]['total']; 
    } 

    $source['total'] = $sum; 
    return $source; 
} 

Wenn Sie ein Ergebnis für die obere Ebene benötigen, diese wird das „Kind“ Schlüssel benötigen. Hier

ist eine Implementierung Ihrer Daten ich für den Test gemacht:

$datas = [ 
    'child' => [ 
     2 => [ 
      'sumW' => 200.39, 
      'child' => [ 
       3 => [ 
        'sumW' => 300, 
       ], 
       4 => [ 
        'sumW' => 100.28, 
        'child' => [ 
         5 => [ 
          'sumW' => 600, 
         ], 
         6 => [ 
          'sumW' => 150, 
         ], 
        ] 
       ], 
       7 => [ 
        'sumW' => 30, 
        'child' => [ 
         5 => [ 
          'sumW' => 100, 
         ], 
        ], 
       ], 
      ], 
     ], 
    ] 
]; 

Und die Ausgabe:

array:2 [▼ 
    "child" => array:1 [▼ 
     2 => array:3 [▼ 
      "sumW" => 200.39 
      "child" => array:3 [▼ 
       3 => array:2 [▼ 
        "sumW" => 300 
        "total" => 300 
       ] 
       4 => array:3 [▼ 
        "sumW" => 100.28 
        "child" => array:2 [▼ 
         5 => array:2 [▼ 
          "sumW" => 600 
          "total" => 600 
         ] 
         6 => array:2 [▼ 
          "sumW" => 150 
          "total" => 150 
         ] 
        ] 
        "total" => 850.28 
       ] 
       7 => array:3 [▼ 
        "sumW" => 30 
        "child" => array:1 [▼ 
         5 => array:2 [▼ 
          "sumW" => 100 
          "total" => 100 
         ] 
        ] 
        "total" => 130 
       ] 
      ] 
      "total" => 1480.67 
     ] 
    ] 
    "total" => 1480.67 
]